なんでも書く

できる限り記録する

AZ-204学習メモ Azure CLI

はじめに

AZ-204のMicrosoft Learnで実際にAzureを触って動かす演習を実施した際の忘備録。

今回実施した演習

learn.microsoft.com
メッセージベースのソリューションを開発するというラーニングパスで、その中でDevelop solutions for Microsoft Azureというリンクの、Send and receive messages from Azure Queue storageとSend and receive messages from Azure Service Busを実施した。

microsoftlearning.github.io

microsoftlearning.github.io

Azure CLI

learn.microsoft.com 演習では基本的にAzure CLIを使ってリソースの作成を行っていく。
コマンドは「az」で始まる。

az group

リソースグループとテンプレートのデプロイを管理する。 learn.microsoft.com

az storage account

ストレージアカウントを管理する。 learn.microsoft.com

az rest

Azure用のcurl
learn.microsoft.com

Microsoft Graph APIを叩く場合はaz restを使うほうが楽。

# curlの場合
# Azureからアクセストークンを取得
token=$(az account get-access-token --resource-type ms-graph --query accessToken --output tsv)
# curlを叩く
curl -X GET https://graph.microsoft.com/v1.0/me \
     -H "Authorization: Bearer $token" \
     -H "Content-Type: application/json"

# az restの場合
# ログイン済みならこれで叩ける
az rest --method GET --url https://graph.microsoft.com/v1.0/me

--query

azコマンドのオプション。jqっぽく使える。
以下のようにユーザー情報からuserPrincipalNameのみ取得するときなどに使える。

userPrincipal=$(az rest --method GET --url https://graph.microsoft.com/v1.0/me \
    --headers 'Content-Type=application/json' \
    --query userPrincipalName --output tsv)

JMESPathというクエリ言語らしい。
learn.microsoft.com

おわりに

Microsoft公式が演習用意してくれるのはありがたい。 試験でもリソース作ったり、コード書いたりする問題もあるらしいので手を動かして覚えていこうと思う。

Googleドライブから完全削除したファイルを復元する

スマホのデータ整理をしており、Googleドライブの容量に空きはあるものの不要ファイルを削除したくなったので、その流れでGoogle Oneストレージ管理ツールで不要データを削除していた。

その際に誤って削除してはいけないファイルを削除してしまった。
以下のダイアログが表示されるのだが完全に削除した後に、「あれ削除しちゃいけないやつだったわ」と思い出し、後の祭りに。
もちろんゴミ箱にはない。

ビジネスアカウントであれば連絡すれば復元できそうだが、個人アカウントなのでまあ無理だろうなと思いつつ助けてGeminiマンをしたところ、ファイルの復元リクエストができるらしい。

というわけでGoogleドライブの[ヘルプとフィードバック]>[Googleドライブで削除したファイルを復元する]と進み、

[ファイルの復元リクエストをする]を選択する。

ブラウザが開き本人確認をしてログインする。
Googleドライブ内にファイルが残っていないか確認する手順もあるが、ドライブから完全削除しているため、いいえを選択して[次へ進む]を選択する。

復元できるファイルは過去25日以内のGoogleドライブから削除されたファイルのみ。
他にも復元できる条件はあるが今回は特に問題ないため、そのままファイルの復元をリクエストする。

リクエスト完了後はメールが来るのを待つ。

しばらく経ったらメールが来たので、削除前のドライブを見に行くとファイルが復元されていた。

ありがとうGoolge、ありがとうGemini。

IoT初心者のためのM5StickC Plus2を使った開発入門

はじめに

私は現在業務でも個人でももっぱらWebアプリ開発をしている。
しかし学生時代にはハードよりのプログラミングも多少していた。
そのため今になってもハードウェアも使ってIoTをしたいと思うことがよくあり、今回は手軽に扱えるM5シリーズのデバイスを使ってみようと思う。

対象

IoT初心者。
LinuxでM5シリーズを使った開発をしたい人。

前提

OS: Ubuntu 24.04.2 LTS + KDE Plasma 5.27.12

購入したもの

以下の2つをスイッチサイエンスで購入。 今回はM5StickC Plus2のみ使用した。
M5StickC Plus2 ¥4,455
M5Stack用温湿度気圧センサユニット Ver.4(ENV Ⅳ) ¥1,056

M5StickC Plus2www.switch-science.com

M5Stack用温湿度気圧センサユニット Ver.4(ENV Ⅳ)--在庫限りwww.switch-science.com

環境構築

Arduino IDEのインストール

公式サイトからLinux向けのZipファイルをダウンロード。

.arduinoディレクトリにダウンロードした。

chmodで読み取りと実行権限を付与する。

起動しようとしたところエラー。

上記のエラーは--no-sandboxオプションをつけることで回避。

エラー解消の参考にしたサイト。
askubuntu.com www.indoorcorgielec.com

Arduino IDEの環境構築

M5Stackの公式ドキュメントを参考に環境構築を行う。
docs.m5stack.com

Arduinoボード管理の設定をする。

  1. 下の M5Stack ボード管理 URL を Additional Board Manager URLs にをコピーして保存します。
    https://static-cdn.m5stack.com/resource/arduino/package_m5stack_index.json

ライブラリマネージャーからM5StickC Plus2の開発ボードをインストールする。
ライブラリのアイコンをクリックして検索して該当のものをインストール。

依存関係のあるライブラリもインストールする。

プログラムを動かす

docs.m5stack.com

開発ボードの選択

Tools>Board>M5Stack>M5StickCPlus2を選択する。

ポートの選択

Tools>Port>/dev/ttyACM0を選択する。

Hello Worldする

以下のコードを書き込み、右上のUploadボタンを押して実行する。

void setup() {
    M5.begin();
    M5.Lcd.print("Hello, M5StickC Plus2");
}

void loop() {
  // put your main code here, to run repeatedly:

}

実行したところ。

サンプルプログラムを実行する

File>M5StickCPlus2>Basic>batteryを選択する。

左上のUploadボタンを押して実行する。

実行したところ。

おわりに

Arduino IDEで環境構築をして、M5StickC Plus2でプログラムを実行させるところまでできた。
M5Stackシリーズは買ってすぐにプログラミングができるように取り扱いやすいハードウェアだし、チュートリアルやサンプルプログラムも豊富にあるのでIoT初心者に非常におすすめだと思った。
次は一緒に購入した温湿度センサーを使ってみたいと思う。

「誰にも読まれなくても書き続けられる仕組み」──LAPRASのAIレビューを活用してみた

はじめに

この記事では、ブログ等のアウトプットを継続的に行うために自分がどんなものを使っているかを紹介したいと思います。

対象読者

IT分野に関わりのある人(LAPRASというサービスを利用するため)。
技術的なアウトプットをしたいがなかなか継続できない人。
書いたはいいものの書きっぱなしになっている人。
自分を定量的に振り返りたい人。

ここで説明しないこと

LAPRASの登録方法などの細かい説明やAIレビュー機能以外の説明。

本編

なぜアウトプットを続けにくいのか

学習を進める上でアウトプットが大事だと言われます。
アウトプットを続けるにはどうすればいいのか。
そのひとつに「誰かに見てもらう」ことがあると思います。
誰かに見てもらい、反応があることで改善のヒントが得られ、やりがいも生まれ、質も高まっていくと考えられるからです。
しかし現実はどうでしょうか。
始めたばかりのブログに読者がつく保証はありませんし、SNSに投稿しても何の反応も返ってこないこともあります。
理想を言えば、禅問答のように反応など求めず、ひたすら書き続けられればいい。
ですが、それを継続できる人はそう多くはないと思います。
少なくとも自分はなかなか継続できませんでした。

続けるために必要なのは「反応」だった

そんな状況でも、自分のアウトプットに必ず反応してくれる存在があります。
それがAIです。
ChatGPTのような生成AIに記事を読ませてレビューさせるという方法もあります。
プロンプトを作り込み、自分専用のレビュワーAIを作ることも可能です。
ただ、そこまでの仕組みを自作するのはそれなりに手間も知識もかかります。
もう少し手軽に、かつ継続的に使える「反応」が欲しい。
そう考えていた自分にとってちょうどよかったのが、LAPRASのAIレビュー機能でした。

補足: LAPRASとは

LAPRASとは、ブログやSNSなどのアウトプットをAIが分析して技術力や市場価値をスコア化できるWebサービスです。
企業からのスカウト機能もあり転職活動にも活用できますが今回は割愛。 lapras.com

LAPRASのAIレビューとは

LAPRASのAIレビューとは、自分の技術記事をアップロードすることで、AIが内容を分析し、「論理性」「実用性」「読みやすさ」「独自性」「明確性」 という5つの観点から5点満点でスコア化してくれる機能です。
また、単なる点数だけでなく、それぞれの観点で改善点や全体講評もフィードバックしてくれます。
利用にはLAPRASのアカウント登録が必要ですが、無料で使えるのがありがたいです。

スコアとフィードバックで記事を改善した実例

以下は自分のAIレビューのキャプチャです。
自分が書いた技術記事の一覧と、それらについての総合評価が表示されています。
最近の3~4記事は、AIレビューのフィードバックを確認し、改善点を意識して書いたため、スコアが上昇傾向にあります。

クリックするとその記事のレビュー詳細を見ることができます。
「【mise use -gをしろ】miseでnodeインストールしたのにnodeが使えない事象の解消」についてのレビューを確認したいと思います。
記事は以下から。
kohey94.hateblo.jp レビュー詳細は以下です。

これにより自分の記事の良い点と改善点を可視化することができます。
自分はこれを読み一通り満足感に浸ったあと、評価3.5の論理性と明確性の改善点を確認しました。
論理性については、節の必要性や関連性が不明確であること、
明確性については、読者の技術レベルや前提知識の配慮が不足であること、
があげられました。

次の記事ではこの点を意識して書きました。
書いた記事は「Ubuntuでセットアップ時以外のネットワークが認識しないときの対処方法」です。
記事は以下から。
kohey94.hateblo.jp レビュー詳細は以下です。

前回の改善点として意識した項目については、論理性:4.5、明確性4.0とどちらも改善することができました。
総合評価も3.8から4.2と上昇しました。

このように自分が書いた記事が数値化され、どこが良くてどこが改善点なのかを確認できるようになるため、「振り返って修正する」というアウトプットの循環が生まれました。

なぜAIレビューは自分に合っていたのか

それは、昔から「自分を客観的に数値化して振り返る」ことが好きだったからです。
これまでにも、LAPRAS以外にもFindyやForkwell(※現在はGitスコア分析は廃止)などの、スコア可視化系のサービスもよく使ってきました。
自分がどう変化したのか、何が得意で何が足りないのか、それを数字として眺めるのが単純に面白いし、次に取るべき行動のヒントにもなります。
だからこのAIレビュー機能も、自分の性格やスタイルに非常によく合っていたのだと思います。

こんな人にLAPRASのAIレビューは向いている

LAPRASのAIレビューは、文章の添削サービスではありません。
継続的にアウトプットするための反応装置であり、定量的に振り返るためのレンズです。
だからこそ、以下のような人にこそおすすめできると思います。
・ブログを書いても続かない
・書きっぱなしになっている
・フィードバックがなくてモチベが湧かない
・自分を定量的に振り返りたい

おわりに

アウトプットを続けるのは難しいです。
それを可能にするための仕組みが「反応」であり、「振り返り」であり、「意味づけ」だと思います。
たとえ誰にも読まれていなくても、AIが反応してくれる。
自分の成長や変化を数字で教えてくれる。
その仕組みがあるだけで、書くことは継続しやすくなります。
LAPRASのAIレビューは、その入り口としてとても良いものだと思います。
自分も引き続き活用していこうと思います。 ぜひ試してみてください。

Ubuntuでセットアップ時以外のネットワークが認識しないときの対処方法

はじめに

正常にセットアップしたはずのUbuntuでセットアップ時以外のネットワークが認識せず、ネット接続できなかった。
その解決方法を書く。

対象

デスクトップ環境で使うけどUbuntu Serverからセットアップした人。
Linuxのネットワーク周りのツール名などのキーワードと概要を知りたい人。
事象の詳細よりも対処手順を知りたい人。

前提

PC: ThinkPad X1 Carbon (2017年モデル)
OS: Ubuntu 24.04.2 LTS
デスクトップ: KDE Plasma 5.27.12

ThinkPad X1 Carbon (2017年モデル)にUbuntu 22.04をインストールして使っていたが、最近Ubuntu Server 24.04 + KDE Plasmaの構成でOSをインストールし直した。
この背景として、Ubuntuを使っていく中で他のデスクトップ環境も試してみたくなり、当初はKubuntu 24.04をインストールしようとしていた。
しかし、手元にあるUSBが4GBしかなく、KubuntuのISOサイズが4GBより大きかったため、Ubuntu Server 24.04の最小構成でインストールして、その後デスクトップ環境のKDE Plasmaをインストールした。
ネット接続について、Ubuntu 22.04のときは問題なく複数のネットワークを認識していたため、ハードウェアレベルでの問題はない。

結論

サーバー用途で使われるSystemd-networkdを使用しており、GUIでの設定変更ができなかったから。
GUIで設定したければ、Systemd-networkdではなくNetworkManagerを使うように設定を変更する。

事象

前提にある通り、Ubuntu Serverをインストールした。
セットアップ中にネット接続の設定を行い、問題なくOSセットアップが完了。
KDE Plasmaをインストールしてデスクトップ環境で使用していたところ、別ネットワークに接続しようとGUIから切り替えようと思ったが、以下画像の通り「利用可能な接続なし」と表示され、ネットワークの変更ができなかった。

「利用可能な接続なし」とあるのにネットに接続できているのはセットアップ中の設定がどこかで生きているからだろうと思っていた。
調べた結果、/etc/netplan/50-cloud-init.yamlUbuntu Serverセットアップ時に設定した内容が記載されていた。
ファイルの中身は以下のようになっていた。

network:
  version: 2
  wifis:
    wlp4s0:
      dhcp4: true
      access-points:
        "hoge-ssid":
          auth:
            key-management: "wpa-psk"
            password: "hoge-password"

Ubuntu Serverはサーバー用途で使われることから、Systemd-networkdを使うことが前提となっているらしい(最小構成でインストールしたことも関係するかも)。
これをNetworkManagerを使用するように変更すれば、GUIからでもネット接続の設定ができるようになる。

キーワード

調べる過程でLinuxのネットワーク周りのキーワードがいくつか出てきたため、以下に羅列する。
詳細はこのキーワードで再度調べよう。

Systemd-networkd

systemdシステム上でネットワーク設定を管理するデーモン。

NetworkManager

Systemd-networkdと同じくネットワーク設定を管理するデーモンだが、ネットワークをより簡単に扱えることを目的として開発されたもの。
デスクトップ環境でGUIでネットワークの設定をしたい場合はこちらを使用する。

50-cloud-init.yaml

cloud-initの設定ファイル。

cloud-init

OS起動時に自動的に環境設定するためのツール。
cloud-init.io

netplan

Ubuntuで採用されているネットワーク設定ツール。
この配下のyamlファイルを読み込み、OSのネットワーク設定をする。 netplan.io

解決手順: NetworkManagerを使用する

50-cloud-init.yamlを削除する

サーバーとして使うわけではないので、50-cloud-init.yamlはもう使用しないため削除でよい、が念の為.bakファイルにしておく。

cd /etc/netplan/
sudo mv 50-cloud-init.yaml 50-cloud-init.yaml.bak

01-network-manager.yamlを作成する

NetworkManagerを使用するためのファイルを作成する。
ファイル名は名前の昇順で読み込まれるため、例えば「01~」、「02〜」のファイルがあったら「01~」から読み込まれる。

cd /etc/netplan/
sudo vim 01-network-manager.yaml

ファイルの中身は以下のように記載する。 

network:
  version: 2
  renderer: NetworkManager

設定を反映する

以下コマンドを実行

sudo netplan apply

以下のようにGUI上でネットワークが認識して別ネットワークに接続することができた。

おわりに

Ubuntuデスクトップ環境やKubuntu、その他デスクトップ環境をインストールする場合ははじめからNetworkManagerを使用するようになっているため特段気にするところではないが、今回はUbuntu Serverの最小構成でインストールし必要なものをセットアップしていく方法を取ったのでこのような事象にあたった。
Linux管理者をしているわけでもないのでちょっとハマってしまったが良い勉強になった。参考情報がネット上に多く存在するのもありがたい。 引き続きLinuxは触っていき知識を深めていきたい。

【mise use -gをしろ】Linux端末においてmiseでnodeインストールしたのにnodeが使えない事象の解消

大結論

mise install node@ltsをした後にmise use -g node@ltsをしていなかったから。

~/.config/mise/config.tomlに使用するツールのバージョンの設定がないとmiseでインストールしたツールが認識しない(ドキュメントをちゃんと読め)。
shimsだとmise ERRORが出るが、mise activateだと何も表示されないためインストール自体できていないと勘違いしてしまった。

以下、miseのshimsの設定不足と勘違いしてまとめた結果。

全く読む必要がないが、なんらかの理由でmise activateではなくshimsを使用する場合に参考になるかもしれないのとせっかく書いたので公開する。


はじめに

現在windows端末とLinux端末を使っている。 Linux端末はUbuntu+LDE Plasmaをインストールしており、そのLinux端末にmiseをインストールし、そのmiseを使ってnodeの開発環境を構築しようとしていた。 その際にwindows端末(WSL2)で起きなかったエラーが発生したので、その解決方法を記載する。

前提

OS: Ubuntu 24.04.2 LTS + KDE Plasma 5.27.12

シェル: Bash 5.2.21

結論

shimsのpathが通っていなかったから。
そのためshimsのpathを通すことでmiseでインストールしたツールを実行させることができる。
https://mise.jdx.dev/getting-started.html#activate-mise

Shims are symlinks to the mise binary that intercept commands and load the appropriate environment. Note that shims do not support all the features of mise activate.

事象確認

miseをインストールする

WSL2同様、クイックスタート通りにインストールする(以下参照)。 kohey94.hateblo.jp

実行コマンドは以下。

curl https://mise.run | sh
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
source ~/.bashrc

正常にインストール完了

nodeをインストールする

mise install node@lts

miseによりインストールできたのにnodeコマンドが実行しない。

miseのshimsのpathが通っているか確認する

以下のコマンドで確認できる。

mise doctor

shims_on_path: no となっているのでpathが通っていない。

pathを直接見てもshimのpathが通っていないことが確認できる。

解決方法

shims配下にnodeは存在するため、shimsのpathを通すことで解決する。

shimsのpathを通す

以下のコマンドでpathを通す。

echo 'export PATH="$HOME/.local/share/mise/shims:$PATH"' >> ~/.bashrc
source ~/.bashrc

pathを通したあと。

globalで使用するnodeの設定をしていなかったため、以下のコマンドを実行する。

mise use -g node@22.17.0

これで正常にnodeが実行できるようになった。

おわりに

公式ドキュメントを見ると、mise activateを使用していれば自動的にpathに追加されるとのこと(つまりshimsは使わなくて問題ないはず)。
https://mise.jdx.dev/dev-tools/shims.html#path-activation

If using mise activate, mise will automatically add the required tools to PATH.

ChatGPT APIを活用したアプリ開発メモ

はじめに

ChatGPT APIを使ったアプリを開発したい。
ChatGPT APIの使い方、アプリへの組み込み方のメモ。

前提

ChatGPTのアカウントは作成済み。
Plus版課金済みだが、API利用時はまた別の料金設定のため関係ない。

手順

  1. アカウント作成
  2. APIキーの発行
  3. クレジットカードの登録

手順詳細

アカウント作成

ChatGPTにアクセスする。 chatgpt.com

右上の「無料でサインアップ」をクリックする。

画面の指示に従いアカウントを作成する。

APIキーの発行

ダッシュボードのAPIキー画面にアクセスする。 platform.openai.com

右上の「Create new secret key」をクリックする。

Nameを入力して「Create sercet key」をクリックする。

APIキーが発行されるため、「Copy」をクリックしてAPIキーを取得し、「Done」をクリックして画面を閉じる。
画面を閉じると再度APIキーを表示することはできないので注意

APIキーを削除したい場合はAPIキー画面の削除したいAPIキーの右側のゴミ箱をクリックすることで削除可能。

クレジットカードの登録

アカウント登録後3か月間は無料トライアル期間らしいので、クレジットカード登録なしでも使用できるとのことだが、自分の場合は3か月以上経っていたため、クレジットカード登録する必要があった。
billing画面にアクセスする。 platform.openai.com

クレジット額が0ドルとなっている。 「Add payment details」をクリックする。

カード情報を入力する。

使用量やオートチャージの設定をする。 オートチャージのチェックを外し、最低限の額である5ドルに設定した。

入力内容を確認して、「Confirm payment」をクリックして登録完了。

クレジット額が反映された。

使い方

基本的には他のAPIと同様に扱える。以下クイックスタート。 platform.openai.com

react,viteで動作確認したかったため、プロジェクトルートに.envファイルを作成して、ファイル内にAPIキーを記述する。

VITE_OPENAI_API_KEY=hogehoge...

fetch APIでPOSTする処理を記述する。

    try {
      const res = await fetch("https://api.openai.com/v1/chat/completions", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          Authorization: `Bearer ${import.meta.env.VITE_OPENAI_API_KEY}`,
        },
        body: JSON.stringify({
          model: "gpt-4o",
          messages: [
            {
              role: "system",
              content: `あなたは、ユーザーが思い描く理想の人物像を実現するために、
必要なスキル・行動・習慣・マインドセットを整理し、ステップ化して提案するAIアドバイザーです。

ユーザーは理想の自分像を自由に語るので、
それをもとに現実的かつ段階的なアドバイスを与えてください。

出力は以下のJSON形式に厳密に従ってください。文章での補足は不要です:

{
  "summary": "string",
  "requirements": {
    "skills": ["string"],
    "actions": ["string"],
    "mindset": ["string"],
    "habits": ["string"]
  },
  "first_step": {
    "description": "string",
    "suggested_datetime": "YYYY年MM月DD日(曜日)HH:MM",
    "message": "string"
  }
}

「first_step」には、今後1週間以内、特に今週の土日を優先して実行日として提案してください。
時間帯は、午前中(10:00前後)や夕方前(15:00前後)など落ち着いた時間を選んでください。
「message」には、ユーザーが実行しやすくなるような、やさしく背中を押す一言を添えてください。
`,
            },
            { role: "user", content: userPrompt },
          ],
        }),
      });

実行結果が以下。上手く動作しているように見える。

おわりに

OpenAIからAPIが提供されているため、アプリ内にChatGPTを組み込むのは想像以上に簡単だった。また、アプリ開発やChatGPT APIの組み込み方もChatGPTに聞きながら開発することができ、ものを作るハードルがかなり低くなったように感じる。
しかし、クレジットの使用量設定やAPIキーの扱い方(今回は動作確認のためフロント側でAPIキー利用しているが、本来はサーバーサイドで扱う)など、気をつけないといけない点はあるので、そこに関してはChatGPTの回答を鵜呑みにせずに再度自分で調べて開発する必要がある。