今回のブログでは、開発途上のベータ版を使って、これからの主流となっていくであろうエッジアプリケーション開発の様子を具体的な例を示してご紹介したいと思います。
できる限り臨場感を持っていただくため、組み込みアプリケーション開発の経験には疎い私自身が、無謀にも、PCWL-0500上で動作する簡易なエッジアプリを実際に作成して動作させることに挑戦してみました。

鍵となるのはAIの活用

鍵となるのはAIの活用です。
Linuxや組み込みシステムについての多少の知識と経験は必要ですが、AIを活用することで、いかに簡単にエッジアプリが開発できるかを以下でお伝えできれば嬉しいです。
PCWL上でのエッジアプリは、コンテナと呼ばれる仮想OS空間で実行されます。PCWLのコアOSの中に、入れ子状に新たなLinux OSを動作させるイメージです。
なぜ、こんな面倒な手法を採用しているかというと、エッジアプリがコアOSや他のエッジアプリの動作に様々に干渉することを防止するためです。

今回は、このコンテナの上で動作するエッジアプリとして、簡易なファイルキャッシュ機能をPCWLに組み込んでみることにしました。
インターネット上の、ある大きなファイル、例えばOSのアップデートファイルや8K動画などの高精細動画ファイルをローカルエリア内のスマホやタブレット、PCなどの複数の端末がダウンロードする際、同じファイルを何度もローカルエリアにダウンロードするので回線の無駄遣いが生じます。

そこでこのファイルを、一旦ローカルエリアネットワーク内のローカルストレージにダウンロードします。これをファイルキャッシング(file caching)と呼びます。ローカルストレージにキャッシュ(cache)されたファイルを各端末がダウンロードすれば、通信トラフィックをローカルエリアネットワーク内だけに閉じ込めることが可能となり、バックボーン回線の負荷を軽減することができます。しかも公衆インターネットを介さないため爆速でダウンロードが行えます。

今回開発するファイルキャッシュアプリでは、このような大きなファイルをインターネットから「ゆっくりダウンロード」し、PCWLのUSBポートに接続したストレージに保存します。同ストレージをPCWL-0500に標準搭載されているSambaサーバ(※WindowsのファイルシステムよりLinuxドライブにアクセスできるようにするフリーソフトウェア)の助けを借りて同じメッシュクラスターに接続する端末からもアクセスできるようにします。これによって、インターネットからPCWL内にダウンロードしたファイルをローカルエリアネットワーク内のPC等で参照できるようにします。

今回開発したファイルキャッシュアプリの概要図

図 今回開発したファイルキャッシュアプリの概要図

「ゆっくりダウンロード」する点が肝で、長いダウンロード時間を許容する代わりに、少ない回線帯域消費でファイルをダウンロードします。これによってメッシュWi-Fiシステムが捌く他の通信トラフィックのスループット低下を抑制できます。USBストレージに時間をかけてダウンロードされたファイルは、公衆インターネット回線を経由することなく、ローカルエリアネットワーク内のPCより超高速でダウンロードが行えます。複数のPCが同じファイルを並列してダウンロードすることによるバックボーン回線の無駄遣いも抑制できます。

環境整備

まずは環境整備からスタートです。
エッジアプリ開発用にカスタマイズされた特別ファームウェアをPCWL-0500にインストールします。
(※本特別ファームウェアは当社が認定したエッジアプリ開発デベロッパーへのご提供となります。一般公開はされませんのでご注意ください。)
次に、当該PCWL-0500のUSB3.0ポートにUSBストレージを挿入します。今回はサンディスク製の256GBのUSBフラッシュドライブを使いました。

今回用いたUSBフラッシュドライブと、PCWL-0500へ挿入した状態の写真

写真 今回用いたUSBフラッシュドライブと、PCWL-0500へ挿入した状態の写真

PCWL-0500のwebUIにアクセスし、アプリケーション~Sambaのページより各種設定項目を設定します。

PCWL-0500のwebUIにアクセスし、アプリケーション~Sambaのページより各種設定項目を設定

これで、Sambaサーバの設定は完了です。当該PCWLが属するメッシュクラスタ配下のwindows PCから正しく本ストレージが参照できるかを確認します。PCのExplorerより、「ネットワークドライブの割り当て」を選択し、以下のようにフォルダーを指定します。

windows PCから正しく本ストレージが参照できるかを確認

"192.168.1.38"は私のローカル開発環境でコンテナが動作しているPCWLに割り当てられているIPv4アドレスです。
完了ボタンを押下するとユーザIDとパスワードを聞いてきますので、PCWLのSamba設定画面で設定したusernameとpasswordを入力します。PCのYドライブに正しくSambaサーバが提供するストレージが割り当てられ、ファイルの保存や削除が確認できれば準備完了です。

PCWLのコンテナ側の準備

次にPCWLのコンテナ側の準備に取り掛かります。
コンテナにログイン後、USBストレージをフォルダにマウントします。USBストレージは、コンテナから/dev/sda1として認識されます。コンテナの/mntディレクトリの下に/extstorageというフォルダを作成し、これにマウントします。

#mount /dev/sda1 /mnt/extstorage

これでコンテナからもUSBフラッシュドライブにアクセスができるようになりました。
次に一番重要なファイルキャッシュ機能を実現するためのプログラムを作成します。ここで、AIの出番です。chatGPTのプロンプトに以下の指示を与えてみました。

"Linux上で動作する簡易なファイルダウンロードプログラムを作ってください。言語はpythonでお願いします。インターネット上で5GB程度のテスト動画を探し、この動画をダウンロードしてLinuxファイルシステム上の/mnt/extstorageに格納します。このテスト動画はmp4ファイル形式が良いです。ダウンロード時の帯域消費を抑制したいので、上限のダウンロードスピードは1Mbpsに絞ってください。"

chatGPTの回答は次の通りでした。

以下は、Pythonを使用してLinux上で簡易なファイルダウンロードプログラムを作成するコード例です。このプログラムは、指定されたURLから動画ファイルをダウンロードし、指定されたディレクトリに保存します。また、帯域を制限するために、1Mbpsの速度制限を設けています。


import requests
import time
 
def download_file(url, save_path, max_speed_mbps=1):
    # 1Mbps = 125000 bytes per second
    max_speed_bps = max_speed_mbps * 125000
   
    response = requests.get(url, stream=True)
    total_size = int(response.headers.get('content-length', 0))
    block_size = 4096  # ダウンロードするデータのチャンクサイズ
 
    if total_size == 0:
        print("Error: Could not determine file size.")
        return
 
    with open(save_path, 'wb') as file:
        downloaded = 0
        start_time = time.time()
       
        for data in response.iter_content(chunk_size=block_size):
            downloaded += len(data)
            file.write(data)
           
            elapsed_time = time.time() - start_time
            expected_time = downloaded / max_speed_bps
           
            if elapsed_time < expected_time:
                time.sleep(expected_time - elapsed_time)
           
            percent_complete = downloaded / total_size * 100
            print(f"Downloaded: {percent_complete:.2f}%")
 
    if downloaded >= total_size:
        print("Download completed successfully!")
    else:
        print("Download interrupted or incomplete.")
 
# テスト用の5GB程度のmp4動画URL(例として仮のURLを使用)
video_url = "http://example.com/large_test_video.mp"
save_directory = "/mnt/extstorage"
save_filename = "test_video.mp4"
save_path = f"{save_directory}/{save_filename}"
 
download_file(video_url, save_path)

解説

1.帯域制限:
○max_speed_mbps パラメータで帯域を制限します。このコードでは、1Mbps(1,000,000 bps = 125,000 bytes per second)に制限しています。
○ダウンロード速度を制御するために、ダウンロード済みのデータ量と経過時間を計算し、必要に応じて time.sleep を使用して待機します。

2.ストリーミング:
○大きなファイルのダウンロード時にメモリ消費を抑えるため、ストリーミングでデータをダウンロードしています(stream=True)。

3.プログレス表示:
○ダウンロードの進行状況をパーセンテージで表示します。

注意点

●ダウンロードするテスト動画のURLを指定する必要があります。video_url に適切なURLを設定してください。
● /mnt/extstorage ディレクトリが存在し、書き込み権限があることを確認してください。

実行するには、事前に requests ライブラリをインストールしておく必要があります。インストールされていない場合は、以下のコマンドでインストールしてください。
pip install requests

残念ながら5GB程度の動画ファイルを探索してくれることはNGでした。セキュリティを考慮して、安易に外部ファイルの紹介を行わないように意図的に遮断しているのかもしれません。そこで、google検索で見つけた500MB程度の動画ファイルを指定することにしました。上記のpythonコードのvideo_urlにこの動画のurlを張り付け、コンテナ上で上記pythonコードを実行しました。

何の問題もなく、/mnt/extstorageにtest_video.mp4がダウンロードされました。windows PCのYドライブでもダウンロードした動画ファイルを確認し、きちんと再生できることも確認できました。
500MBのファイルを1Mbpsでダウンロードするため、1時間以上のダウンロード時間を要しましたが、通信回線の帯域消費が僅少であるため、当該ファイルのダウンロード期間中、通常のインターネットを介した他の作業(web会議も含む)にはほとんど影響を感じることはありませんでした。PCWLのCPU占有率の上昇も1%未満でした。

人間は「エッジコンピューティングで何を実現したいか?」を考えることに集中できる

AIが100%作ってくれた今回のコードはエラーフリーで所望の動作を実現してくれました。言語の細かなステートメント規約やパラメータの制約など、対象となるプログラミング言語に不慣れな人は、短いプログラミングでも泥沼に陥ってしまいがちです。そのような無駄が一切なく、一発で所望の機能を実現できたことは驚き以外の何ものでもありません。何をやるかを決めてから1時間程度で目的を達成できました。
しかも私はpythonプログラミングはほぼ初心者なのです!
これからの時代、自然言語形式でAIに指示を出せば、AIがプログラミングをやってくれるということです。人間は「エッジコンピューティングで何を実現したいか?」を考えることに集中できるようになるでしょう。

プログラマーに求められるスキルセットとAIとの関係

もちろん、的確なコードをAIに作ってもらうためには、具体的で論理的な指示をAIへ与えることが重要です。そのためには、最低限のOSや通信プロトコルに関する知識、プログラミング言語の性質を理解しておく必要があります。
また、各AIはそれぞれ学習された知識やセキュリティポリシーが異なりますので、贔屓のAIとは時間をかけて対話しながらその特性を知ることも重要です。このように考えると、AI脅威論の一つとして叫ばれている「AIがプログラマーを不要にする」的論調は的確な未来予想とは言えず、プログラマーに求められるスキルセットがAIの普及とともに変化していくことが未来において起こるように感じます。

    

著者

代表取締役社長 古川 浩

PicoCELA株式会社
代表取締役社長 古川 浩

NEC、九州大学教授を経て現職。九大在職中にPicoCELAを創業。
一貫して無線通信システムの研究開発ならびに事業化に従事。工学博士。