【Power Automate Desktop】UiPath Demoの経費登録をPower Automate Desktopでやってみた。
Power Automate DesktopとUiPathのどちら良いか
先日MicrosoftがWindows10ユーザーに対して、Power Automate Desktopの利用を無料化しました。
これによりRPA業界には大きな衝撃があると思います。今回は数あるRPA製品の中でも多く導入実績のあるUiPathの無料版を利用して、簡単な実装を行ってみたいと思います。使用するのは以下の3種類です。
こちらが実際のデモ動画になります。
【RPA】UiPathとPower Automate DesktopでUiPath Demoをやってみた。
UiPath StudioX
Web上の情報はExcel読み込みベースのものが多いので、今回はCSVから読み込んで実装してみました。
ただ、CSVから読み込んで繰り返しを行う際は結局Studioライクな書き方(変数)になってしまいました。
以下が実際に作成したフローです。(長いので分割してます)
StudioXはやっぱりExcelメインで使っていかないと、結局StudioのようにDataTable型の変数を使用していだけになってしまうので、この使い方はおすすめしません。
しかし、Excelを持っていなかったり不具合で利用できないことも考えられるので、CSVを使用したフローもどこかで利用する機会はあるかと思います。その時は上記フローをご活用ください。
UiPath Studio
tudioもCSVから読み込みで実装しています。
StudioXに比べるとtToStringメソッドの記述が必要だったりと、少し知識を問われるかと思います。だたそこまで難易度が上がるわけではなく、普通のWebページの操作であれば難易度は変わらないかと思います。
難易度の高い開発になればStudioのほうが優位となるのは明確なので、StudioXの必要性に少し疑問は残ります。
もちろん変数の概念をほとんど考慮せず利用できるのは大きなメリットですが、そこを理解していないのに開発をしてしまうCitizen Developerを養成するのは少し危険な気もしますね。(あくまで個人の見解です)
特に変数に抵抗がなければ下記のようにStudioでの開発にトライしてみてください。
Power Automate Desktop
Power Automate Desktopは無料なのにとても使いやすくて驚いています。(有料のPower Automateライセンスもあります)
正直なところ、特にスケジュール実行等をしない場合は無料のPAD1つですべて事足りるかと思います。無料版なため、有料ライセンスで利用できるクラウドフローや無人実行などは使えませんが、これに該当しない業務の自動化であれば全く問題ありません。
開発難易度の所感としてはStudioX < Power Automate Desktop < Studioという感じでした。
利用可能なアクティビティも多く、UiPath Demoのような一般的な定型業務であればすぐに実装可能です。
UIも利用しやすく、初めてなのにも関わらず5分とかからずに以下のフローは作成できました。
まとめ
今回はUiPath Demoを3種類の製品で実装し、それぞれの開発難易度差を体感することができました。
特にPower Automate Desktopの有用性には驚いています。このレベルのツールが無料となると他社製品を選択するユーザーの絶対数は確実に減ると考えています。
おそらくこれを機にRPA業界にある程度変化が訪れると思うので、今後もチェックして発信していきたいと思います。
【LINE・GAS】LINEでGoogle Spread Sheetsの家計簿を更新!
この記事を見ると分かる・できる事
この記事では以下の手順を記載しています。
・Google Apps Script(GAS)でLINEのメッセージを処理
・API経由でGoogle Spread Sheets(GSS)にデータの追加
LINEからの入力形式やGSSの登録は個人差があると思いますので、自分用にするためにはカスタマイズが必要であることをご承知おきください。
LINEからGoogle Spread Sheetsの家計簿を更新する
今月から同居者と家計簿をつけることになり、ツールとしてGSSを利用する運びとなりました。約一ヶ月くらい家に帰ってからPC上で入力していたのですが、これがなかなか面倒に感じました。
PCからは面倒なので、スマホから移動中に更新してしまおうと思いましたが、スマホからGSSの操作はやりにくい。そこでAPIを駆使すればどうにかなるのではと思い至りました。
LINEのMessaging APIとGASを利用することで、無料で実装できてしまったので、今回はその手順をまとめたいと思います。
構成のざっくりしたイメージは以下の通りです。
px.a8.net
- この記事を見ると分かる・できる事
- LINEからGoogle Spread Sheetsの家計簿を更新する
- 準備
- Googe Apps Scriptでプロジェクト作成
- Messaging APIとGoogle Apps Scriptの連携
- GASでLINEからの情報を受け取る
- doPost関数の作成
- JSONからデータの抽出
- Google Spread Sheetsに書きこみ
- 登録完了メッセージの送信
- 動作確認
- まとめ
準備
実装にあたって、API等を利用するための設定作業が必要になります。登録が必要なサービスは以下になります。
LINE Messaging APIでは新規チャネルを作成しMessaging APIを選択します。Google Cloud Platformでは新規プロジェクトを作成し、Spread Sheets APIのサービスアカウントキー発行を行います。
この辺は検索すれば詳しい記事が多数ありますので。詳細な登録手順の説明は省略します。持っていない方はいないと思いますが、Googleアカウント必須です。
以下より実際にそれぞれのツールを連携させていきます。
Googe Apps Scriptでプロジェクト作成
まずはGAS上に新しいプロジェクトを作成します。
script.google.com
最初は関数が1つあるのみですが、以降の作業のために一度デプロイします。デプロイは右上のボタンからできます。デプロイタイプはウェブアプリ、アクセスできるユーザは一応全員にしてください。
次にこのウェブアプリにアクセスするためのURLを取得します。URLはGAS右上のデプロイのプルダウンからデプロイ管理を選択すると表示されます。これをコピーして控えておきます。(これがWebhook送信先)
Messaging APIとGoogle Apps Scriptの連携
LINEでメッセージを送ったときにGAS上のスクリプトを動かすためには、そのメッセージが来たタイミングでGAS上に内容を送信する必要があります。これを可能にするのがWebhookになります。
Messaging APIはWebhookに対応しており、設定はチャネルにあるMessaging API設定>Webhook設定の部分を編集します。
今回はGAS宛に送りたいのでWebhook設定の箇所にGASでデプロイしたウェブアプリのURLを記載します。ここに記載するURLが先ほど控えたURLになります。
張り付けたら検証を押して成功が表示されれば設定完了です。これでこのチャネルのボットが参加しているトークにメッセージが来るたびに、GASへと情報が送信されるようになりました。
GASでLINEからの情報を受け取る
Webhookで情報は送られてくるようになりましたが、そのままでは家計簿に登録することができません。家計簿に登録するにはGAS上で以下の作業が必要になります。
doPost関数の作成
この関数はPOSTリクエストに対しての処理を記載する関数になります。今回のWebhookはPOSTで送られてくるので、この関数に処理を記載する必要があります。
まずは関数を作ります。引数はeventの頭文字でeとしていますが、何でも結構です。
function doPost(e) { //ここに処理を書いていく }
JSONからデータの抽出
次はWebhookで送られてきたリクエストをJSONにパースして、JSONから必要な情報を取得します。
今回はLINEから家計簿を登録する際に以下のような形式でLINEを送るようにしました。
食費 1000
一行目は使用用途、改行を挟んで2行目に金額を入力し送信しています。
メッセージは以下のように取得しています。
//JSONにパースする var json = JSON.parse(e.postData.contents); //送られたLINEメッセージを取得 var message = json.events[0].message.text; //メッセージの配列化 var array = message.split(/\n/);
今回は項目を改行して分けているので、改行で分割して配列化しています。つぎはこれに対し入力チェックを行いますが、その前に返信用にMessaging APIのエンドポイントとヘッダーを設定します。
//返信用のエンドポイント var url = "https://api.line.me/v2/bot/message/reply"; var headers = { "Content-Type" : "application/json; charset=UTF-8", "Authorization": "トークンを記載", };
トークンはMessaging API設定のチャネルアクセストークン(長期)をコピーして貼り付けます。
今回は入力形式が正しいか、金額が数値で入力されているか、金額が1以上の整数かどうかの3つをチェックしています。チェック用のコードは以下になります。
//項目数チェック if ( array.length != 2 ) { var reply = { "replyToken" : json.events[0].replyToken, "messages" : [ { 'type':'text', 'text':"項目数が誤っています" } ] }; var options = { "method" : "post", "headers" : headers, "payload" : JSON.stringify(reply) }; return UrlFetchApp.fetch(url, options); } //数値チェック try { if (!Number.isInteger(Number(array[1])) || !Number(array[1]) > 0 ) { var reply = { "replyToken" : json.events[0].replyToken, "messages" : [ { 'type':'text', 'text':"金額は1以上の整数で入力して下さい" } ] }; var options = { "method" : "post", "headers" : headers, "payload" : JSON.stringify(reply) }; return UrlFetchApp.fetch(url, options); } }catch(e){ if (!Number.isInteger(Number(array[1])) || !Number(array[1]) > 0 ) { var reply = { "replyToken" : json.events[0].replyToken, "messages" : [ { 'type':'text', 'text':"入力値が不正です" } ] }; var options = { "method" : "post", "headers" : headers, "payload" : JSON.stringify(reply) }; return UrlFetchApp.fetch(url, options); } }
エラーになった場合は UrlFetchApp.fetch(url, options) によって先ほど指定した返信用のエンドポイントにreplyを送るようになっています。
replyの中には実際にLINE上に表示させるメッセージとreplyTokenを設定します。replyTokenを指定しないと返信するトークが分からないため忘れないようにしてください。
これでJSONからのデータ抽出とチェック・エラー処理は完了です。
Google Spread Sheetsに書きこみ
家計簿は以下のようにしてあります。
画像の通り、日付・用途・金額を入力する形になっています。そのため日付を取得後、C列の最終行の1つ下にデータを追加します。シートの名前は年/月になっています。
//日付取得しシート名の取得 var date = new Date(); var sendDate = Utilities.formatDate(date, 'Asia/Tokyo', 'M/dd'); var sheetName = String(Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/M')); //エラーがない場合は登録情報の設定 var spreadsheet = SpreadsheetApp.openById('シートのID'); var sheet = spreadsheet.getSheetByName(sheetName); var lastRow = sheet.getRange(3, 3).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); sheet.getRange(lastRow+1, 3).setValue(sendDate); sheet.getRange(lastRow+1, 4).setValue(array[0]); sheet.getRange(lastRow+1, 5).setValue(array[1]);
入力するシートを特定するためにシートIDを指定します。シートIDは該当シートを開いた際のURLから取得できます。
https://docs.google.com/spreadsheets/d/シートID/edit#...
これで家計簿シートの更新は完了です。
登録完了メッセージの送信
登録完了メッセージはエラー処理の時と同じ方法で行います。返信用のメッセージは入力内容をStringにして連結させています。ヘッダーは先ほどのものをそのまま使用しています。
//登録完了メッセージの返信 var text = '日付:'+String(sendDate)+'\n用途:'+String(array[0])+'\n金額:'+String(array[1])+'\n\n上記内容で登録しました。' var reply = { "replyToken" : json.events[0].replyToken, "messages" : [ { 'type':'text', 'text':text } ] }; var options = { "method" : "post", "headers" : headers, "payload" : JSON.stringify(reply) }; UrlFetchApp.fetch(url, options); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
動作確認
最後に実際にLINEから入力して動作確認をします。
成功時の動作確認
LINEからは以下のように入力しました。
送信するとすぐに返信が返ってきます。まずは正常に入力した場合の結果は以下のようになります。
実際にGSSを確認すると以下のようにしっかり登録されていました。1・2行目は予め手入力してあったものです。
エラー処理の動作確認
エラーの処理も以下のように問題なく動作することが確認できました。
エラーメッセージの返信が行われ、シートの更新もされませんでした。これで動作確認は完了です。
まとめ
今回はLINEからGSSに情報を登録するために様々なツールを活用しました。今日ではAPIを使うことで様々なことが実現できるため、無料で実用的なツールが作成できます。
これからも実際に生活で利用できるツールを作ってまとめていきたいと思います。
【拡張機能】すべてを黒くする?Chrome拡張機能「Dark Reader」が強い
ダークテーマ
最近は様々なサイトやアプリで「ダークテーマ」といったような、暗い配色にすることができることが多くなってきました。
しかし、ブラウザを使用して様々なサイトを利用する場合は、そのすべてがダークテーマ化されているわけではなく、対応している部分は結構限られていますよね。
ここ最近は常にリモートワークになり、PC前から全くといっていい程動かなくなった私としては、近距離でひたすらブルーライトを浴び続けている状態です。
そのせいなのか目の疲れが溜まり、瞼がピクピクと痙攣することが多くなりました。
そこで、ブラウザすべてを一括して暗くできれば幾分かましになるのでは?と考えたわけです。そしてタイトルにある「Dark Reader」にたどり着きました。
今回はこのChrome拡張機能の利用方法についてまとめていきます。
Dark Readerの追加
Dark Readerはchromeウェブストアから追加することができ、すぐに利用が可能です。ページは以下になります。
chrome.google.com
追加が完了したら、Dark Readerを有効化します。有効かは拡張機能の管理画面から行います。chrome右上のパズルのピースのようなアイコンから有効にするか、設定の拡張機能から有効にしてください。
Dark Readerの設定
Dark Readerの設定画面は以下のようになっています。
ブラウザ上のほぼすべてを暗くできるだけでなく、輝度・コントラスト・セピア・グレースケールをカスタマイズして使用することができます。
暗くしてしまうとかえって表示が見づらいサイトもあります。その場合は、サイトリストタブにあるブラックリストに、適用させたくないサイトを登録します。
ホワイトリストを利用すると逆に登録したサイトのみに適用されます。
この辺は各々の用途に合わせてご利用ください。
まとめ
Chrome拡張機能は他にも様々なものがあり、想像よりも数倍便利なものがゴロゴロ
あります。しかも無料のものばかりです。
定期的にチェックしてよさそうなものがあれば、また取り上げたいと思います。
【UiPath】Pythonより簡単!UiPathのデータスクレイピングで超簡単に情報収集
スクレイピングを簡単に
スクレイピングといえばPythonのイメージがありますが、UiPathでおこなった方がとても簡単です。
基本的にスクレイピングは情報を得るための手段なので、簡単であればあるほどいいと思っています。そこで今回は私が良く利用しているUiPathのスクレイピングについてまとめたいと思います。
UiPath初心者の方も無料で始められますので、ぜひお試しください。初心者向けの書籍としては以下のできるシリーズがおすすめです。
データスクレイピング
今回はデータスクレイピングを利用してUiPathのコーポレートブログページの情報を取得していきます。そして、データスクレイピングで得た情報をもとに各記事の本文を取得します。
www.uipath.com
データスクレイピングは以下から設定します。
データスクレイピングの設定
データスクレイピングをするには、実際に取得する対象の要素を選択していきます。また、選択する要素は一定のパターンで並んでいる必要があります。
今回はコーポレートブログページの1記事を要素選択します。選択は要素の1番目と最後の2つを設定します。今回でいうと1番左上の記事と右下の記事になります。
パターンが認識でき、選択が完了すると以下の画面が出ます。ここでURLを取得をクリックしてください。
URLではなく取得できたテキストをベースにクリックしてもいいのですが、動作の安定性を考えてURLに移動をすることで、各記事の本文に移動する方法をとっています。
次へを押すと実際に取得できる情報の一覧が表示され、ウインドウ下部では最大取得数が表示されます。今回は10記事分しか取得しないので、あまり関係ありません。ちなみに情報が存在するだけ取得したい場合は0を入力します。
これで最後に完了を押したら設定完了です。あとは出力されるDataTable型(ExtractDataTable)の変数をCSVにして出力したり、データベースに入力したりなど、必要な処理を行えばOKです。今回はCSVに出力させます。
記事本文の取得
次に取得した情報から、各記事を開き本文を取得します。取得した情報をきれいにしておきたいので、新しく情報格納用のデータテーブルを"データテーブルを構築"アクティビティで作成します。(BlogDataTable)
記事本文の取得は先ほど取得したExtractDataTableの各行に対して繰り返しで行います。本文を表示するために繰り返し毎に二列目のURLを利用して”URLに移動”アクティビティを使用します。
本文は"テキストを取得"アクティビティを使用して取得し、要素の選択ではボディの記事本文を丸ごと囲める範囲の要素を選択します。
取得した本文文字列は変数に格納しておき、記事タイトル・URLと合わせて先ほど新しく作成したBlogDataTableに追加します。アクティビティは"データ行を追加"を使用し、プロパティは以下のようにしています。
<
データが追加できたらあとは繰り返しですべての記事に同様の処理を実行します。
これで、すべての情報を格納したデータテーブルが作成できました。あとはこれをCSVに出力するだけです。
以下がここまでの繰り返し部分のフローです。
CSVへ出力
最後にデータテーブルをCSVとして出力します。使用するのは"CSVに書きこみ"アクティビティです。書き込み先と変数を指定するのみで実行できます。今回は以下のようにしています。
フローの全体
作成したフローの全体はこのようになっています。
このような情報を収集して資料に残すような定型業務は自動化しやすいので、ブログ記事でなくても様々なものに対して利用することができます。
是非皆さんも身近な業務を自動化させてみてください。
【API Gateway】AWS初心者がPythonのrequestsでAPI GatewayとLambdaを使ったら便利すぎた件
APIを使いたい
最近Webアプリを作る学習?をしてることもあり、Python上で外部のAPIを利用することが多くなりました。
今回は、AWSのAPI Gateway宛にリクエストを飛ばして、Lambdaでなんらかの処理を行い、結果を受け取るまでの流れを書き残しておきます。
px.a8.net
Lambda関数の作成
今回はAWSのユーザ設定等が完了しており、すぐに開発に取り掛かれる状態を前提として記載していきます。
マネジメントコンソールからLambdaを選択し、関数を作成します。
作成が完了すると、このような画面が出てきます。ここからすでにあるAPI Gatewayをトリガーに設定してもいいのですがまだ作成していないので、今回はAPI Gatewayを作成するときにLambda関数を指定してあげることで連結を行います。またLamdaの関数上でAPI Gatewayにreturnするため、送信先は特に設定しません。
今回は動作確認だけなので、とくに処理は記載しません。本来は、リクエストをlambda_function.pyで受け何らかの処理を施し、API Gatewayの渡していく流れになると思います。
APIの作成
次に実際にPythonのプログラムから利用するAPIを作成します。AWSのサービスからAPI Gatewayを選択しAPIを作成をクリックします。今回はREST APIを選択します。
次にアクションからメソッドを追加します。リソースを作成してその中にメソッドを作成するのが良いですが、今回は特に作りこむ予定はないので、直下に作成してしまいます。今回はGETで作成します。
セットアップは以下のようにしています。マッピング等は設定方法がイマイチわかっていないので、プロキシ統合にチェックを入れておきました。(チェックすると勝手にしてくれる?)Lambda関数は先ほど作成した、hatena_testを選択しています。
テストをして問題なくレスポンスが帰ってくることを確認したら、アクションからAPIをデプロイしておきます。
PythonでAPIを利用する
最後にPythonから実際にAPIを利用できるかどうかを確認します。APIのエンドポイントはステージから確認できました。
このエンドポイントに対しrequestsのGETで呼び出しを行います。実際に利用したコードは以下になります。
import requests res = requests.get("エンドポイントのURL") print(res.text)
これでレスポンスのボディにある「Hello from Lambda!」が表示されます。
今回は検証のためメッセージの確認まででしたが、API GatewayとLambdaを使用すれば、様々な機能を作れるということが分かりとても勉強になりました。
おそらくこれからどんどんAWSを利用する機会は増えて来ると思いますので、積極的に利用していけるようにしたいと思います。
【情報処理安全確保支援士】新卒1年目のSEが情報処理安全確保支援士試験に合格するためにした事
令和2年度 情報処理安全確保支援士試験に合格しました
春期の試験は、新型コロナウイルスの影響でなくなり時間が空いてしまいましたが、無事合格することができました。
ちなみに現段階で登録する予定はありません。
今回は合格するまでにした事をまとめたいと思います。
スペック
学習開始前(2020/2月)における私のスペックは以下になります。
学歴
・理系 情報系専攻卒(研究室の関係でプログラミングは9割独学)
学歴は情報系ですが、研究室がバリバリ非情報系だったので、開発とかやったことなかったです。
以下にもう少し詳しく記載します。
すでに取得していたIT関連の資格
・基本情報(FE)
・応用情報(AP)
プログラミング関連スキル
・Python(paizaのAランクくらい)
・Java(基本的なのは書ける)
・C(基本的なのは書ける)
・HTML/CSS(基本的なのは書ける)
その他IT・PC関連の知識
・機械学習・AI(Kerasとかでモデル作成までできる程度※コピペが主)
・PCは組める(電子工作は無理)
試験に関連しそうな部分はこのくらいです。
また途中、これに加えて研修の一環としてORACLE MASTER Silver SQL 2019を取得しています。
勉強した期間・時間
実際に試験勉強に取り組んでいたのは以下になります。
・春季:2020/02~2020/04
・秋期:2020/09〜2020/10
ちなみに春季の時点では過去問に対して、平均7割以上の得点がとれるようになっていましたが、秋期の学習を始める際には5割いかないくらいまで落ちていたので、ほとんど忘れてしまっていました。
春期と秋期のおよその勉強時間は以下になります。
休日:4時間
使用した参考書
使用した参考書は以下になります。
情報処理安全確保支援士合格教本
こちらは参考書の内容に加えて過去問とその解説も収録されているので、やりこめばこれ一つでも合格できる可能性は高いです。実際に私の秋期の学習時間の6割はこの書籍に費やしました。
情報処理安全確保支援士「専門知識+午後問題」の重点対策
ITECの定番書籍は、重点対策と本試験問題の2種類の書籍がありますが、私個人としては午後を中心的に鍛えられる重点対策の方が好きです。
正直この書籍で数問解くだけでも勘所が分かれば全然合格できると思います。実際私も全部を説いたわけではなく、「このテーマは出たら何書いて良いかわからないな」という問題を中心的に学習しました。
インシデントが起きてからの対応フローや発生原因は考え方が共通していることが多い印象をうけたので、とりあえず一周するよりも、少なくてもいいので深い理解に努めることが重要だと感じています。
ハッキング・ラボのつくりかた 仮想環境におけるハッカー体験学習
これはタイトルにひかれて買ってみた書籍になります。試験対策に必須ではないのですが、実際に仮想環境内で攻撃を行う体験ができるので、通信の流れや対策の取り方がイメージしやすくなります。
攻撃者側の視点を理解するということは極めて効果的とも考えられるので、時間のある方はぜひ取り組んでみてください。
勉強の内容
勉強の内容としては書籍と過去問道場になります。費やした時間の割合は以下です。(春季と秋期合わせて)
ハッキングラボ:10%
重点対策:25%
合格教本:60%
試験の結果
以上の勉強の結果獲得できた点数が以下になります。
午後2が少し低いですが、特に危ない感じもなくパスできたと思っています。
試験を終えて
参考書で知識を詰め込むことも重要ですがあくまで試験ですので、どのような問題が出て、どのように解答するのかという部分を把握することが重要になると思っています。(もちろんすべての知識をインプットした方がいいです)
特に難関である午後はストーリー性のある問題になっているので、自分の中でインシデント対応のフローが分かっていないと、全問的外れな記述をしてしまう可能性があります。
これから学習する皆さんは知識詰め込みと暗記から回答を導き出すのではなく、
ということに重点を置くことをおすすめします。
【リモートワーク】新卒1年目SEのテレワーク・在宅勤務のおすすめアイテム #2
リモートワークで座ってばかり
リモートワークはどうしても座ってばかりになってしまい、体重が増えたり集中力が下がったりと、不向きな方も多いかと思います。
私は昇降デスクを導入することで立ちながらの作業も可能となり、大きく作業効率が改善したので、今回はこれを中心に紹介したいと思います。
Viozon昇降デスク
私が購入したのは以下のデスクになります。
こちらはすでにあるデスクの上において使用するものです。おそらくすでに昇降式のデスクを使用されている方は少なく、ほとんどの方が普通のデスクを利用されていると思います。そのような状況で、新しく昇降デスクを購入して既存のデスクと入れ替えるというのはなかなかハードルが高いですよね。
そこで重要おすすめしたいのが卓上に設置する昇降デスクです。卓上式であれば以下のメリットがあります。
・組み立て不要
・置くだけなので設置が簡単
誰でもすぐに使い始めることができ、昇降もレバー1つでできるので、気分によって座りながら・立ちながらの切り替えができます。
注意点として、ノートPCでなくデスクトップPCを使っている方は、昇降デスク上に置くのではなく、元のデスク上にモニタを置く形になります(小さければ昇降デスクでも大丈夫そう?)。
そのため、座位・立位でモニタの高さを調節するためにモニタアームも同時に購入されることをお勧めします。
モニタアームは先日の記事で紹介したこちらをお勧めしています。
これらを合わせても2万円程度になると思うので、ぜひ購入をご検討ください!
まとめ
今回は昇降デスクについて紹介しました。他にもおすすめのアイテムがあるので、随時紹介していきたいと思います。