えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

炎上&回収された某Web3解説書、何が問題だったのか!?(いちばんやさしいWeb3の教本)

2022年、7/20に発売された某Web3解説書はIT界隈を超えてインターネット上で話題となり、瞬く間に発売中止となりました。

理由は「内容がデタラメである」と言われています。

この本は数日経った頃に購入ができなくなり、回収の発表がありました。

book.impress.co.jp

この発表により更に注目されるようになり、むしろプレミア価格が付くほどの(別の意味での)人気を獲得することとなりました。


なぜこの本が出され、一体どこが問題だったのでしょうか?

買わずに批評するのは非常にまずいですし、なんならチョット読んでみたかったこともあり、1冊入手しました。


結論から申し上げると、この本の問題は

  • タイトルが非常にまずい

  • 1章・2章の内容がサーベイ不足

  • 端折り方が下手

の3つにあるのかなと考えています。


内容の問題点については、発売当初からかなり多くの人に言われていますしここで述べるまでもないと思うので、割愛させていただきます。


ビジネス本としては普通な気がする。

「内容がデタラメ」であると散々言われまくっているこの本ですが、後半だけについては論法について問題はなく、でたらめなことは言っていないように見えます。

おそらくこの本は「最近流行りのビジネスワード"Web3"」に興味を持った人が書店(ないしはネットショップ)でさらっと読む感じの想定で話を進めているように見えるので、(この本でいうところの)Web2以前のお話は難しくしすぎないようにしようと考えていたのでしょう。


そのため、この本は「技術紹介書」ではなく、「ビジネス書の補助教材」という立ち位置が正しい解釈に見えます。


しかしながら、Web3の基礎となっているblockchain技術を理解するには、公開鍵暗号を理解することから始まるため、その分野のベースとなっている知識がないとなかなか厳しいでしょう。素人はおそらく3章まではそもそも深く理解しようとしないでしょう。(Web3にしか興味がないという前提だからです)


ただし、専門分野を素人に分かりやすく解説するのは、私が常日頃頭を抱える問題であるので、「著者は無責任なことを言っている!」と評価するのはあまりにも酷だと感じます。彼は題材とタイトルを間違えただけなのです。

「適切なタイトル」というのもなかなか難しいですが。


無料公開しなければ…

全体的にサクサクと読める(ように意図的に編集した)内容で、読みやすい印象がありました。

そのため、公開しない・あるいは仮に公開した情報が5章以降だったらそれほど炎上しなかったのではないかと考えています。

何かしらのサービスに誘導しようとするわけでもなく、「調べてみてください」という促しは好印象でした。


このような書籍を読まなくたってどうせ似たような書籍を読む読者がいることを考えれば、「害がある」みたいな論調の批判についてはそれほど問題ではないと考えています。

出費が1500円で済むならむしろ良心的だと思いますね。ハイ。


以上、擁護編(救えない)でした。


問題点:Web3が何かを超越したものとして扱われているような表現

「GAFAMがプロトコルを独占している」や「Web3上でのOSはblockchainで構成されます」などの迷言を生み出したページです。(特にOSのくだりはやばい。イーサリアムOS?????、Linuxはどこへやら)

論法にも、あやふやなところが多く、「Web2とWeb3の比較の結果Web3が優位である」という説明は物足りなさを感じてしまいます。

確かに、現環境におけるSNSなどのサービスへの誘導は非常に巧みに作成されており、いつの間にかそのプラットフォーマーに依存する状況になっているのは間違いないと思います。

一方で、現在のGAFAMのサービス独占の状況は過去の開発者やユーザの選択の結果でもあると思います。

その状況を踏まえた上で、Web3をユーザが「選択する」プロセスを書かないと、「なぜ私達がWeb3に乗り換えるべきなのか」という疑問を解決できず、Web3がなにか未知のもの・現在の常識を超越したものに見えてしまいます。

プラットフォームやツールを選ぶのは私達のはずなのに、なぜWeb3がWeb2に代わって支配的になり乗り換える前提で話が進んでいるのでしょうか?あと数年後に世界的にWeb2を禁止する法律ができるのでしょうか?

私を含めてWeb3に対して懐疑的な方々はそのように感じられていると思います。

そもそもセキュリティについては分散化や暗号化技術は既に実現しているので、Web3がめっちゃ優位だとはこのような説明では実感しにくいと思います。(←それがプロトコルの独占だとか言われたらまぁ…とはなりそう)


blockchainでOSを構成しようとする動きはあるみたいで、SNSやブラウザなどの他のサービスについても実在しているみたいですが、これらのサービスはWeb3時代の始まりのプロジェクトに1つに過ぎず、「代わって使われるようになる」というにはまだ(10年以上も)早い気がしました。

以上より、あのデタラメと言われているページは、「超頑張って素人向けに砕きまくった結果」であり、その意味を100%理解するのであれば専門的な知識と圧倒的サーベイ力が必要となります。

この本は我々に向けた暗号だったのでしょうか…?


他の問題では、「図・表が曖昧でわかりにくい」や「参考に作成した画像がほとんど元の本とそのまま」などが挙げられており、「教本」を名乗るのにはふさわしくないようにも見えます。

どちらかといえば超長い(意識高い系)ブログ記事に近かったです。


感想 : 回収するほど酷くはないが…

あまりにも逆張りな感想を抱くことになってしまった自分が信じられませんが、回収するほど酷くはないと思います。

ただ、タイトルはまずかったと思います。

「いちばんやさしい Web3の"教本"」なんて書き方をしたら、本当に学びたい人もターゲットにしているように見えます。実際そうなんでしょうけど。


サクッと読めることを考慮するのであれば、分量についてはやむなしだとは思わなくもないと感じましたが有料Noteとかでもいいのではとも感じました。

領域的に分からないところについてはしっかり調べたり、 構成を相談すべきだなと感じました。


あとは、このような本は他人事ではないと思った次第です。

私の記事も端折っている部分はありますので、前提条件については、過去の経緯を見つつ平等に比較できるように心がけたいと改めて思いました。


なにかと話題の絶えないWeb3・blockchainですが、まだまだ結論を出すにはドキュメントが枯れきれていない感があるので、分断を生まない程度に発信していってほしいと思います。


参考書籍

田上 智裕. いちばんやさしいWeb3の教本 人気講師が教えるNFT、DAO、DeFiが織りなす新世界 (「いちばんやさしい教本」シリーズ) ISBN : 978-4295014454

Ubuntu22でM5Stackなどのデバイスと接続ができない場合

マイコンのプログラム開発・実行する環境がUbuntu-desktop上だと、22.04-Desktopで初期設定した後、なぜか/dev/ttyUSB0に認識されない問題が発生します。

正確には、「差した直後は認識されるけどすぐ消える」状態です。

マイコン開発はWindowsMacでもできなくは無いですが、元々Ubuntuを普段使いしている勢からすれば大変な問題です。


原因:点字ディスプレイドライバ「brltty」との競合

これは、M5Stackシリーズのシリアル変換チップに対してUbuntu22側が勝手に点字キーボードドライバと認識しているからです。


Ubuntu22-desktopは、新しいアクセシビリティツールとして点字ディスプレイをデフォルトでサポートするようになりました。

点字ディスプレイとは、以下の情報を点字を用いて知らせるものです。

  • 文字情報
  • カーソル位置(一部機種)


このアップデートはさらに多くの人を受け入れる非常に良いものですが、M5Stackなどのシリアル変換モジュールも勝手に認識されてしまい、普段の開発では邪魔になってしまいます。

これについて少し調べたところ、その解決策が載っているものを見つけました。

askubuntu.com

どうやら/usr/lib/udev/rules.d/85-brltty.rulesがFTDIチップを自動的にデバイス点字ディスプレイとして認識させているようで、そのルールを無効化すればよさそうです。

serialとして認識されるルールは60番なので、時間差で上書きしているのでしょうか?

確か、ルールが競合した場合はソート後の最も後のルールが適用されたはずです。


解決策

点字ディスプレイを使用しない場合はアンインストールすれば良いです。残す場合は、85-brltty.rulesの一部分をコメントアウトするといいです。(上のaskubuntu.comの最初の回答より)

# アンインストール
sudo apt remove brltty

USBデバイスをもう一度差し直すと認識されるようになります。

YOLOv7-tinyをdarknet-rosで使用する

オブジェクト検出アルゴリズムとして有名なdarknet (YOLOv3) がYOLOv7というナンバリングで帰ってきたようです。

過去のバージョンの検出速度・精度を大幅に超えてきたようで、競合の研究に大きな影響をもたらしそうです。


今回は、私が管理している「darknet_ros」をYOLOv7仕様にしてみました。

darknet_ros自体はComposableNodeに対応していないなどの関係上、YOLOv7の性能を全て引き出せるとは限りません。


以前にもdarknet_rosやdarknetに関する記事は多く投稿してきましたが、結構時間が経っています。懐かしい。

darknet_ros(Foxy)でScaled-YOLOv4を使う - えいあーるれいの技術日記

ROS NoeticでDarknet-rosは動くらしい(OpenCV4+CUDA11.2) - えいあーるれいの技術日記

ROS2-Foxyでdarknet-ros(Ubuntu20.04+OpenCV4.2+CUDA11.2) - えいあーるれいの技術日記

ROS2 Foxy + YOLO v4 の実装(darknet_ros) - Qiita


YOLOv7 (本家派生版)が出た!

YOLOv7は2022年7月6日にarXiv上に掲載された論文上のアルゴリズムです。

GitHub上でも紹介されており既に3500以上のスターを獲得するなど、「YOLO」の名前も影響しているためか、非常に高い注目を集めていることが分かります。

「YOLO」の名前は全く関係ない研究チームによる論文なき実装がここ2年で散見されるようになり、この「YOLOv7」も名前に乗っかったアルゴリズムなのではないのかと思わせるようなネーミングに見えます。


…が、YOLOv7の共著者にはYOLOv4の開発を行なった Alexey Bochkovskiy先生も入っています。

YOLOv7は、YOLOv3, YOLOv4の正統進化ということになります。

arxiv.org

また、その性能の数値上の高さも注目です。昨年注目されたYOLOXとも比較し、推論速度・精度においてYOLOv7が高いことが示されています。


ナンバリングではYOLOv4→Scaled-YOLOv4→YOLOR→YOLOv7の順で論文が掲載されており、4から7になっています。5、6が飛ばされているのは、既出のアルゴリズムと比較するためだと考えられます。

Introductionでは、次の3つのキーワードについて、高速化を試みているそうです。

  • vanilla convolution
  • depth-wise convolution
  • MLP operations

(Introductionより)


ターゲットはGPU・モバイル向けGPUを想定されているそうです。


YOLOv7がdarknetでも動作する!?

論文公開日にdarknetでもYOLOv7をサポートする旨のissueが立てられました。

github.com


現在は推論のみのサポートで、自作する場合はPyTorchで学習を行い、.pt形式のファイルを.weightsに変換する必要があります。

また、以前のバージョンに加えて representation_layer 関連のソースコードを含める必要があります。

darknet_ros も今回のアップデートに合わせてsubmoduleを更新しました。

詳しく知りたい場合は、本家のコミットログよりも私のsubmoduleアップデートのプルリクを見た方が参考になると思います。(v4-cspとv7の差分が確認できます)

github.com

darknet_ros側の変更はありませんでした。ただし、フレーム名などの変更が利きやすいようにパラメータ関連のアップデートは行なっています。


むしろこれらの変更だけで動くとか神かよ…


darknet_ros_fp16 (YOLOv7版) の使い方

リポジトリは以下から↓

github.com


darknetはNNにしては非常に依存が少ないプログラムで、ROS2さえ入れておけばビルドが通ってしまいます。launchファイルを調整すればUbuntu18とかでも動くと思います。

ただし、CUDAを使わないと使い物にならないレベルで遅いので、CUDA(できればcuDNNも)を入れておきましょう。


環境

  • Ubuntu22.04 LTS + ROS2 Humble-desktop-full
  • CUDA 11.7 (NVIDIA 515.5)
  • 入力 : v4l2-camera

事前インストールリスト

  • cuda
  • ros2-humble-desktop-full
  • ros2-humble-v4l2-camera
# ダウンロード
git clone https://github.com/Ar-Ray-code/darknet_ros_fp16 --recursive ~/darknet_ws/src/darknet_ros_fp16
darknet_ws/src/darknet_ros_fp16/darknet_ros/rm_darknet_CMakeLists.sh

# ビルド (サンプルの重みは自動でダウンロードされます)
source /opt/ros/humble/setup.bash
cd ~/darknet_ws/
colcon build --symlink-install
source install/setup.bash

# 実行 (USB経由でWebカメラを接続してください)
ros2 launch darknet_ros yolov7.launch.py


動きました!


元祖・高速物体検出が強くなって帰ってきたみたいな感じでいいですね!

ただし、商用目的での使用についてはPyTorchでの学習・推論を行うとGPL3.0ライセンスの制限などいろいろと制約があるので注意してください。(以前のYOLOXのようにはなりにくいとは思いますが…)


逆風はあれど、技術の進化に伴って広がる可能性にはいつもワクワクさせられます。

気が早いですが、次の新たなAIの登場が待ちきれません!

GitHubのやたら騒がしい実績「AchievementsのYOLO」

最近、なにやら変なバッチがプロフィールに付くようになりました。

しかも増えてるし…


どうやら、GitHubがゲームにおける実績解除システムなるものを始めたそうです。

GitHubには、自分の名前のリポジトリを作成することでREADMEをプロフィールページ風にすることができます。


私がフォローしているようなGitHub廃人たちはそのプロフィールを飾るに相応しいバッジやアドオンのようなものをしばしば入れたりします。

それらのバッジは、どれくらいの貢献をしたのかをグラフで表すものやトロフィーのような実績レポートなど形や表示形式など多種多様です。


今までのGitHubではそのようなバッジがなかったので、有志たちの手によってGitHub上のデータをもとに実績解除システムを作成されていました。これをGitHub公式も「Achievements」という名前で始めたというわけです。


しかし、この「Achievements」、GitHubユーザーの間で賛否両論の話題となっているのです。

Achievements自体は1つ日本語で記事を書かれている方を見つけましたが、話題のディスカッションについて深掘りされていいる方は見当たらなかったので、こちらで掘り下げていこうと思います。


現在獲得可能な実績

詳しくは以下のGitHubリポジトリを見てみてください。

github.com

獲得可能な実績

名前 主な条件 回数 ランクがあるか
Pair Extraordinaire マージ済みプルリクの共著者となる 1
Quickdraw 開いたプルリクor issue をすぐ閉じる 1 -
Starstruck 1つのリポジトリで多くのスターを得る 16
Galaxy Brain Discussions上での回答が他の人に認められる 2
Pull Shark プルリクエストをマージする 2
YOLO レビューを行わずにマージする (Community?) 1 -
Arctic Code ault Contributor 2020年のアーカイブプログラムに貢献する 1 -
Public Sponsor GitHub Sponsors (個人・団体) に支援する 1 -
Mars 2020 Contributor Mars 2020 helicopter Mission に貢献する 1 -


問題児「YOLO」

実績システムは2022年6月9日のリリース後に大変反響があったようで、GitHub-communityのディスカッショントピックでも「どうやったらこれらの実績を獲得できますか?」みたいな質問が飛び交っているようです。

その中で最も嫌われている(?)実績があり、これが前述の「YOLO」です。

「YOLO」は複数人が管理するようなパブリックリポジトリ上のプルリクエストをレビューなしにマージすると付与される称号です。

共同作業に反した行動による称号のため、ルールに厳格な人ほどマイナスな印象を受けるちょっと変わった性質の実績です。

↓ちなみに私はこのプルリクで実績を解除しました…(+1は共同開発者です)

実際、このコメントよりも前にかなりコメント・ディスカッションを交わしており、正直なところ「YOLO」の条件を満たすかと言われると無理がある気がします。

(私は、ウマ娘の馬人間判定という「YOLO」の数十倍は馬鹿げたリポジトリがあるので、こんな実績は可愛いものです : urara-challenge


実際に、私のような事象で実績を解除された方々が多く、非常に不満を持っているようです。

ディスカッションで「Remove YOLO」と絞ってみました。かなり検索で出てきて正直驚きました。


「YOLO」に対する不満の例

Childish achievements · Discussion #18345 · github-community · GitHub

Remove the YOLO "achievement" · Discussion #18590 · github-community · GitHub

YOLO · Discussion #18568 · github-community · GitHub

Please remove YOLO or provide an option to hide it · Discussion #18340 · github-community · GitHub

YOLO · Discussion #18542 · github-community · GitHub


皆さんの想像通り、「採用の人に誤解される」「GitHubを仕事のツールとして使っている人にとって良くない実績」という意見が出ており、「YOLO」だけ消せないかという要望がいくつか見られます。

一方で、「そもそもGitHubの実績のみが採用の判断基準になり得ない(←それで資質を判断するほうがYOLOよりも問題)」という意見もあり、賛否両論というわけです。


現時点での解決方法

GitHub個人用設定の「Show Achievements on my profile」のチェックを外すことで全ての実績を非表示にすることができます。


私見

(わざわざ走っている途中にコケたことをメダルにして渡す必要もない気はしますが)

仮に1度コケた(失敗した)として「彼は走ったらコケる人だから走らせてはいけない」とはならないと思うので、そんなに気にする必要はないんじゃないかぁと思います。

何事も挑戦していたら失敗もあると思うので。

アイコンのデザインもいい感じだと思うので、個人的には気に入っています。

STM32F7Discovery上でmicroros-arduinoを動かす

STM32F7Discovery上でmicro-ros-arduinoを動作させてみました。


STM32 + ROS2

STM32マイコンはArm®Cortex®‑Mをベースとしたマイコンシリーズで、高性能・安価・低消費電力なMCUとして教育用途から産業用途まで広く用いられています。

STMマイコンはチップ単体だけでなく、Arduinoシールドを用いてボードの拡張が可能な「Nucleo」や高性能なSTM32の機能を手軽に体験できるDiscoveryシリーズなどもあり、マイコンを手軽に扱えるラインナップも魅力的です。


一方で、(Arduinoシールドが多く用意されているのにもかかわらず)STM32マイコンといえばSTM32CubeIDEかMbedで開発されることがほとんどで、開発ではあまりArduinoを使用することは無いような気がします。

ROS2 + MCU のライブラリであるmicro-ROSでもSTM32CubeMX仕様のライブラリが用意されています。

github.com


Arduinoの方ではmicro-ROSのリファレンスボードであるSTM32-E407で動作することを確認されているそうです。(しかもEthernet!)

github.com

ライブラリにおいて「手軽に扱える」ことはとても大切なことなので、ダメ元でビルドしてみることにしました。


STM32F7Discovery

手元に積んでいたSTM32F7Discoveryがあったので、これを使用します。

os.mbed.com

このボードは5年くらい前に買ってから、少しは触ったもののあまり活用できず積んでいたものです…5年の歳月を経てようやく活躍の時が来たようです。

STM32F7Discoveryは、タッチパネルやカメラコネクタ、オーディオ端子などが揃っており、ボード単体でモバイル機器を作成できるくらいの高スペックなマイコン開発用ボードとなっています。

値段は8000円程度です。


各種ファイルの調整

以下の環境を使用してmicro-ros-arduinoを構成しています。


platformio.ini

ポイントになるのは、-L ./.pio/libdeps/disco_f746ng/micro_ros_arduino/src/cortex-m4/です。micro-ros-arduinoでは、コンパイル済みのライブラリをリポジトリ内に入れてそこからリンクさせています。

え?STM32F7Discoveryに載っているMCUってCortex®-M7なのでは…

(なぜか互換性があり、そのまま動いてしまいました)

[env:disco_f746ng]
platform = ststm32
board = disco_f746ng
framework = arduino

monitor_speed = 115200
upload_speed = 115200

lib_deps =
;; microros ---------------------------------------------------------------
    https://github.com/micro-ROS/micro_ros_arduino.git
    stm32duino/STM32Ethernet@^1.3.0
    stm32duino/STM32duino LwIP@^2.1.2

build_flags =
    -L ./.pio/libdeps/disco_f746ng/micro_ros_arduino/src/cortex-m4/
    -l microros

ターゲットの流用

micro_ros_arduinoライブラリ内のmicro_ros_arduino.hnative_ethernet_transport.cppの1行目に#define TARGET_STM32F4申し訳なく思いながら追記します。

現在のライブラリではサポートされていない体になっているので仕方ありません。


micro-ros_publisher_ethernet.inoをmain.cppにコピー

#include <Arduino.h>を忘れずに!

timer_callbackはありますが、どう見てもloopからしかpublishされておらず、timerが動いていません。

SubscriberとTimerについては、分かり次第ここに追記していこうと思います。

追記(07/12):Timer・Subscriberどちらも正しく動作しました。(同時実行も可能でした)


接続

Agent起動のオプションはESP32を無線でmicro-rosに接続するのと何ら変わりませんでした。

ここまでで STM32F7Discovery + micro-ros の説明は以上です。

いろいろ設定してビルドしないと動かないと思いきやほとんど設定を変えずにビルドできてしまったので驚きです。


mROSもSTM32F7Discoveryをサポートしているそうで…

STM32 + ROS2といえば高瀬先生の「mROS2」も忘れてはいけませんね…!

STM32F7Discoveryでも動作確認ができているらしく、Agent不要なシステムを組みたいのであればそちらを使用してみてもいいかもしれません。

github.com

mROS 2|デザイン/サポート|STM32, STM8ファミリはSTの32bit/8bit汎用マイクロコントローラ製品