Windows 7 で Scratch から micro:bit を扱えるようにする

学童のプログラミング教室で、Minecraft on Scratch から子供の興味を引きはがすべく、micro:bit を 5個(増税前、消費税8%の駆け込み)購入しました。

実はスイッチサイエンスさんはキャッシュレス還元に対応したそうなので、10/1 以降に購入したほうがお得だったわけですが。まあ、いいや、勢いで送料無料になる1万円まで大人買いです。

※ああ、結果だけ欲しい方は、一番最後にジャンプするといいです.

学童で子どもに試してみる

プログラミング教室をやっている学童に先に請求してもよいのですが、ここは実験も兼ねて自腹で購入。うまくいけば後で、欲しい子には2,000円也で購入してもらうか、学童に請求を上げるかというところなのですが。

あえなく「玉砕」です。

まず、数あるプログラミング教室の中で、私が行っているところは、

  • 小学3-6年生が10人ちょい雑多に集まっている感じ。
  • 予算の関係上、中古 ノート PC の Windows 7 を使っている。
  • 場所が共有スペースを使っているので、デスクトップ PC は置けない。
  • 有線 LAN が使えず、無線 LAN(私物の Pocket WiFi)を使っている。
  • ノート PC に Bluetooth が付随していないものが多い。
  • 中古のノートPCなので、USB が 1個しか生きていないものが多くて、USB ケーブルのマウスと付け替えないといけない。
  • そもそも、micro:bit(mbed) への HEX ファイルのドラッグ&ドロップが子供には難しい。

このプログラミング教室は、3年前から始めたのですが、プログラミングを教える…ってのは雑多な環境では難しかったので、「Scratch で遊ぶ」にシフトしました。いは、Scratch で作られているゲームならば、なんでも ok ってことで、ファミスタもどきとか青鬼もどきとか、いろいろ流行りがあって、今はマインクラフトもどきなのです。
ちなみに、ゲームばかりやっている子ばかりではなくて、Scratch でゲームを自作している子もいます。

  • ゲームを自作している子には、適宜質問に答える&適宜手伝う。
  • ゲームをしている子は、攻略法は友達同士で話し合ってね

というルールでやっています。学童の目的として「安全に子供を預かる」が有線なので、プログラム自体を教えるってのは二の次なのです。とはいえ、漠然と遊ばせるだけはつまらないので、毎回プリントを配るし(1回300円也を徴収しているので)、それなりに「パソコンに慣れる」ことを目的としています。

と、いう状況はさておき、プログラミング環境としてはあまりリッチな環境ではありませんが、そこは工夫次第というところです。

Scratch から micro:bit を操作する

micro:bit を操作する方法は2種類あります。

MakeCode を使ってプログラミング

https://makecode.microbit.org/

こんな感じでブロックを使ってプログラムをして、micro:bit に流し込みます。ダウンロードした後に HEX ファイルをドラッグ&ドロップする方法と、あらかじめ micro:bit とリンク(たぶん、BLEを使っている)させておいて「ダウンロード」ボタンを押したら直接流し込んでくれる方法です。

手元の PC でやると、この自動流し込みが便利なので操作的にはさほど気にならないのですが。Bluetooth の付いてないデスクトップPCとか、古い Windows 7 のノートPCだと結構な手間です。

あと、Scratch に慣れていると、この

  • プログラムをコンパイルして、マイコン(micro:bit)に流し込む

という流れが難しかったりします。そのあたりは、電子工作で Arduino を使っていれば慣れるので(というか慣れないといけない)ので、それはいずれやるつもり。

Scratch 3.0 から直接 micro:bit を操作

https://scratch.mit.edu/

もうひとつ、Scratch 3.0 の拡張機能を使う方法です。Scratch 3.0 では、あらかじめ micro:bit に scratch-microbit-1.1.0.hex なファームを書き込んでおいて、BLE 通信をしながら操作する方法です。これだと、いちいち micro:bit に書き込む必要がなくて、Scratch の操作だけで micro:bit を扱えます。

micro:bit と BLE 通信で連携をするので、

  • micro:bit のAボタンを押したら、猫に喋らせる
  • Scratch 猫をクリックしたら、micro:bit の LED を光らせる

という動きが簡単にできます。これだと、物理的なものを「プログラミングで操作する」というのが直感的にわかっていいです。内部は、ややこしいことになっているのですが。

Scratch で micro:bit を操作するためには、条件があって、

  • BLE 接続できること
  • Scratch Link を動かしておくこと

があります。micro:bit と BLE 通信をするので、Buetooth が必要なのはいいのですが、さて、Scratch Link がちょっと癖ものなのです。
Scratch Link の動作条件が、

  • Windows 10 以降
  • macOS

ということになっていて、Windows 7 では動かない。何故?ってことになります。

scratch-link
https://github.com/LLK/scratch-link

理由は、Scratch Link のコードを見るとわかります。Windows の場合、UWP で使われている Bluetooth モジュールを使っていて、これが Windows 10 以降しか入っていないんですよね。Windows 8 が出た頃に、BLE 通信が流行った時代があって、そのときに Windows 7 で動かそうとして悪戦苦闘した覚えがあります。結局 BLE 通信は無理なので Bluetooth のシリアル通信にしましたが。実は、Scratch Link 内部ではシリアル通信も対応しているのですが、インストール環境が Windows 10 以降になってしまっているので、これでも Winodws 7 は使えないのです。まあ、そのときは自前ビルドをするわけですが。

Scrach 3.0 のコードは Github で公開されているので、

の3つから調べることができます。scratch-microbit-1.1.0.hex のコードは見つからなかったのですが、まあ、これは BLE のペリフェラルなところなので省略してもokでしょう。

ざっと、調べたところこんな感じです。



Scratch on Browser WebSocket ^ | JSON-RPC v WebSocketServer JSONRPCWebSocket + didReceiveCall Scratch Link BLESession + DidReceiveCall + OnValueChanged ^ | BLE GATT v BLE micro:bit
  • Scratch 3.0 で WebSocket を使っている
  • Scratch Link は WebSocketServer で待ち受け
  • Scratch 3.0 – Scratch Link の間は JSON-RPC で通信
  • Scratch Link と micro:bit は BLESession で BLE 通信

そうなると、Scratch Link の JSON-RPC で受けているところを適当に WiFi に切り替えてやって、ラズパイや適当な Windows 10 を挟み込んだプロキシを作ればいけそうですね。

と思って、Scratch Link のコードを .NET Core で書き換えようとしたところ、Scratch 3.0 -> Scratch Link な URL ってどうなっているのか?と思い至りました。いやいや、WebSocket を使ったことがなかったので。

Scratch Link – Japanese Scratch-Wiki

を改めてみると、『そのため、Scratchはlocalhostに直接アクセスできないため、device-manager.scratch.mit.eduに接続する。』という一文があります。たしかに、scratch-vm のコードを検索すると、この URL が書いてあって、直接ローカルなPC(localhost とか 127.0.0.1 とか)には接続していないんですね。

なるほど!WebSocket って localhost が使えないのか!ってことでした。
思い込みで、localhost しか使えないのかと思っていたのですが、実は localhost「は」使えないという落とし穴が(苦笑)あったのですね。
なので、Scratch 3.0 は、拡張機能で WebSocket を使うたびに device-manager.scratch.mit.edu を呼び出して DNS で 127.0.0.1 を返して貰っています。

hosts を変更する

となれば、話は簡単です。
いちいち、ローカルホストに接続するために device-manager.scratch.mit.edu を呼び出しているということは、他の PC を呼び出したい場合は device-manager.scratch.mit.edu を通す必要がない、ということです。

なので、実現したい環境として、

  • Scratch 3.0 が動いている Windows 7
  • micro:bit と接続している BLE ありの Windows 10

という別々の環境を作った場合、Windows 7 から Windows 10 の Scratch Link への通信に切り替えてやればよいわけで、

  • Windows ならば、C:\Windows\System32\drivers\etc\hosts
  • Linux ならば /etc/hosts

を書き加えます。



192.168.1.28 device-manager.scratch.mit.edu

「192.168.1.28」なところは、Windows 10 のある PC の IP に書き換えてください。こうすることで、device-manager.scratch.mit.edu への呼び出しが偽装されて、micro:bit に繋がっている Scratch Link(Windows 10 あるいは macOS) へ接続されます。

2以上繋がっている場合は、こんな風に並ぶので名前で使い分ければよいでしょう。

scratch-vm のほうを書き換える

なお、もう一つの方は、scratch-vm にある WebScoket の接続先を書き換えます。

scratch-vm/scratch-link-websocket.js at develop · LLK/scratch-vm

scrach-gui/vm/link をあれこれやっているのは、自前でオリジナルなブロックを創ったり、Android の Firemate に繋げたりしたいので、こっちのほうはいずれ試してみる予定。

カテゴリー: 開発 | Windows 7 で Scratch から micro:bit を扱えるようにする はコメントを受け付けていません

Scratch から micro:bit を操作する Scratch Link を自前ビルドする

マインクラフト on Scratch から子供たちを脱却すべく(別に脱却する必要もないのだけど)、micro:bit を5個購入しました。

なんで5個なのかというと、スイッチサイエンスさんで10,000円以上だと送料が無料になるからです。消費税8%のうちの駆け込み需要かと思いきや、スイッチサイエンスさんは実はキャッシュレスの軽減税の対象になったそうなので、どちらが安いのか分からないのですが。まあ、5個購入しました。

左に移っているのは chibi:bit で、以前購入したものです。確か、猫ボードあたりと揉めたときに記念に買ったものです。まだ、micro:bit に BLE が技適が通っていなくて Bluetooth のチップを独自で乗せて独自に技適を通したもの…だったハズです。実は、本国(英国)から送って貰ったものが手元にあるはずなのですが、行方不明で。

それはさておき、micro:bit を使います。

micro:bit をブロックプログラミングする

プログラムしましょう | micro:bit

micro:bit は Scratch のようにブロックプログラミングができます。内部は Google の Blockly がベースになっていて Microsoft が開発というハイブリッドな環境が話題になりました。

ここのサイトは、micro:bit の mbed な機能を使って、USB 接続したドライブに HEX ファイルを落とし込むという方法でプログラムを変更します。Arduino IDE や mbed を使っていると、なじみのある方法です。

実は、ブロックだけじゃなくて、Python や JavaScript も使えるので、キータイプをしたい場合にはこっちのほうを使うといいかもしれませんね。特に JavaScript のほうはブロックにしてから JavaScript のコードを表示できるので、コードの比較ができて便利です。

Scratch から micro:bit を操作する

もうひとつのほうは、Scratch の拡張機能を使って micro:bit に Bluetooth 接続をする方法です。

動作環境が、

  • Windows 10 あるいは macOS であること
  • Windows 10 側に Scratch Link が動作していること

と若干敷居が高いのですが、micro:bit が Bluetooth 接続できます。micro:bit にはあらかじめ、”Scratch micro:bit HEX” をインストールしておいて、Scratch Link 経由で micro:bit に接続します。HEX ファイルは Scratch – micro:bit でダウンロードができます。ちなみに、chibi:bit のほうは、https://t.co/KiQDkQIgw3 からダウンロードが可能です。

Scratch 側で micro:bit のブロックを作って、micro:bit のボタンや加速度センサーによって、Scratch 側で動きを制御できます。

このあたりは、micro:bit サイトの MakeCode よりも試行錯誤ができて便利です。

?

仕組みはどうなっているのか?

さて、ここまできたら、どういう動作になっているのか?できれは自作でハックをしてみたいのがプログラマの性です。いずれは、Scratch 3.0 のほうに独自の拡張ブロックを入れて、ということも視野にいれて、

を参考にして、独自の Scratch 3.0 環境を作ります。
Ubuntu on Windows を立ち上げて、以下でインストールします。



$ git clone --depth 1 https://github.com/llk/scratch-vm.git 
$ git clone --depth 1 https://github.com/llk/scratch-gui.git

後は、ビルド


$ cd scratch-vm 
$ npm i 
$ npm link 
$ cd ../scratch-gui 
$ npm i 
$ npm link scratch-vm

あとは、npm start すれば、http://localhost:8601/ で接続できるようになります。


$ cd scratch-gui 
$ npm start


micro:bit 拡張機能のコードは以下にあります。



scratch-vm/src/extensions/scratch3_microbit/index.js

接続方法として

Scratch 3.0 <=> Scratch Link <=> micro:bit

になるわけですが、

  • Scratch 3.0 と Scratch Link の間は、JSON
  • Scratch Link と micro:bit の間は BLE

です。
拡張機能を自作したい場合は、JSON のところをフックすればよいので、適当な拡張機能をコピーすればなんとかできそう。

BLE 通信のほうは、実は Scratch Link は以下で公開されています。

LLK/scratch-link at master

このコードを改変してビルドをすれば、独自に BLE をフックできるハズです。
ざっと中身をみてみると、UWP の BLE を使っていて GATT で通信させています。GATT を使っているので、Windows 7 とかでは動かないわけです。
現状はラズパイでは動かないようですが、macOS のコード(swiftだけど)をうまく修正すれば、macOS 以外でも動くかもしれません。

自前の Scratch Link をビルドするには、ちょっとコツがあります。というか、対象の開発環境が古いみたいで Visual Studio 2019 ではビルドができません。
.NET Framework のバージョンを最新(v4.7.2)に上げた後に、エディタで以下の修正をします。

Windows/scratch-link/ScratchLink.csproj

  • Windows.winmd ファイルの参照先を自前のものに変えておく。

- <hintpath>C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.16299.0\Windows.winmd</hintpath>
+ <hintpath>C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.18362.0\Windows.winmd</hintpath>

最後の scratchVersion.targets を削除する



- <import project="..\scratchVersion.targets">

本来は、scratchVersion.targets の git あたりを修正するのがよいのですが、ひとまず参照自体を削除。バージョンが 0.0.0.0 になるので、ちょっとまずいのですが。

この修正が終わると、無事ビルドが通って

  • 自前の Scratch 3.0(scratch-gui, scratch-vm)を起動
  • 自前の Scratch Link を起動
  • micro:bit に BLE 接続する

ことができます。

カテゴリー: 開発, Scratch | Scratch から micro:bit を操作する Scratch Link を自前ビルドする はコメントを受け付けていません

掌握術のコールド・リーディングの話を少し

プログラミングは技術的な側面を押し出す理系的な面が多いけれど(この「理系」もかなり語弊があるが)、なにかと政治的な面に首を突っ込まないといけないことが多い…と言いますか、政治的な話でプロジェクトが潰されて現場のプログラマが被害を被るということが多々あります。

実は、アジャイル関係の教本には「政治的なことは別なところで解決してくれ」とはじめにと書いてることもあり、政治的な話を避ける傾向があります。が、ケント・ベック氏が10数年前に来日時に話していた通り「私たちの頃は、社会不適合者がプログラミングをしていたが、これからは社会的なコミュニケーションが重要視されると思う。娘の姿をみているとそう思う」なのです。ときに、XP がペアプログラミングで相互コミュニケーションを重要視したように、何かを技術的な側面だけで解決できるとは限らない、ということです。まあ、私自身も、いまとなっては「古い人間」なので、政治的な問題は苦手なところが多くできるだけ避けてはいるのですが、そのあたりは、技術者らしく政治的なものも技術的側面で解決するという脇道も考えるのです。

さて、某K議員の発言もあり、政治的な発言が「空疎」であると同時に、なにか深い意味がありそうなという「深読み」をする面もあり、いったいどちらなのだろうか?と思うところもあるでしょう。そのあたりの結論は脇に置いて(その問題は私の関知するところではないので)、もっと某K議員の天然ではないところに注目してみます。

目の前の人の共感を得る方法

会話というものが、瞬時的に1対1で行われる以上、相手からの好意を引き出すというのは円滑なコミュニケーションをする上で重要なことです。円滑なという言葉を使いましたが、狡猾なという言い方に変えても同じです。要は、相手に嫌悪感を与え防壁を作るよりも、うまく壁を取り除き(自分の壁は置いたままで)、自分の言葉刷り込ませるというテクニックを使います。

相手が好意を持つ(嫌悪感を持たない)ようにさせるためには、「あなたのことは特別です」という意図を伝えるのがベターです。一般的には、相手の目を見て会話する、という方法がとられますが、複数名に話しかけると同時にひとりに話しかけるということも可能です。

  • 会話をするときに、数秒間だけ相手のほうに顔を向ける
    → いわゆる、アイドルを見て「私だけを向いた!」という奴ですね。
  • 事前に調べた、その人しか分からない(と思われる)情報ををチラ見させる。
    → あなたのことを知ってますという方法
  • 会話の中で知った、その人の言葉を使う
    → あたなの言葉を私はきちんと聞いていますというアピール

人間も動物なので、自分だけが特別が扱いされるとうれしいものです。「うれしい」=警戒心緩むということですね。警戒心が緩むと、相対的に猜疑心が減るので、心の隙間に入りやすくなります。

ただし、よく営業トークである、相手に YES で同意するというのは、以前はよかったのかもしれませんが、最近は「胡散臭いやつ」や「なんでも YES と言えばいいと思っている奴」に見えるので、やめたほうがベターです。だんだん、人々は賢くなってきていますからね。優しい雰囲気は、老人にはいいのかもしれませんが。

この好意を与える方法の逆を取って、嫌悪感を与えるという方法も使えます。いわゆる、スケープゴート(生贄)をグループの中に作って、スケープゴート以外で団結させるという技ですね。先の好意を寄せるこの逆をすれば、グループの中に生贄を作れます。

  • その人からの質問をはぐらかして、他の人の質問を受け取る。
  • その人からの意見を取り上げた上で、別の人の意見に同意する。

これは某都知事がやっている方法で、たぶん無意識でやっています。この手の会話術は無意識でできる人(おそらく育ちだと思う)と、無意識ではできない人がいます。結果的には、無意識でできる人が、政治家向きなのですが(心理的なストレスが少ないので)、これを意識的にやる(会話をしているときに、裏で二重に会話を構成する)人は、政治家以外にもちらほらといるので注意が必要です。

相手の情報を事前チェックする

昔(30年前位だろうか)の営業としては、事前チェックは当たり前のことだったし、必須であったと思うのですが今はどうなんでしょう?昔はインターネットがなかったので、相手の情報を内密で得るのはなかなか困難でした。新聞なり図書なりを利用したり、事前に廻りの人に聞いたりするしかなかた訳で、コールド・リーディング(事前に知った相手の情報を利用する)の手法は占い師の秘匿の手段でもありました。

ただし、今だと事前に相手の情報を得るのは結構簡単です。

  • Google で相手の名前を検索する
  • Google で相手の会社を検索する、地図を見ておく
  • 商品情報や研究内容を検索する
  • 類似品の情報を検索する
  • 技術要素の用語を検索しておく

のように、相手の名前や社名で検索すれば結構でてきます。これは完全に事前ではなくても、会議中のトイレの中でも検索できるわけで、相手にとって「よく知っている人」に見えるようになります。つまり、警戒心を下げられるわけです。

私の場合はあまり得意ではないのですが、相手の会社の地図から、食べ物情報を検索して「あの店はおいしいですよね」と雑談するのもよい方法です。ええ、やる過ぎると胡散臭くみられるので、注意が必要ですが。

会話中に相手の情報を利用する

もうひとつの掌握術として、リアルタイムに会話をしているときに、相手の情報を使って相手の警戒心を下げるという方法もあります。ホット・リーディングと呼ばれますが、これも単なる会話術にひとつですね。

その場で知った相手の情報を活用するだけでなく、「相手に自分が何かを知っているように思わせる」という手法があります。これが冒頭に書いた、某K議員の話であって、

  • 何か言葉を使っているが「空疎」な言葉しか吐かなくて馬鹿なやつ
  • 何かグローバルな言葉を使って「意味深」な頭の切れるやつ

という感想が同居します。これ、同じ言葉を同じシチュエーションで使っても、受け取る側で二面的に取られるということです。そして注意したいのは、どちらも会話を発している本人とは関係ないところで起こる現象です。

image

さんざん、マスコミでの情報の切り取り問題が起こっているので、発言者から発せられた「発話A」が、それぞれの受け取り方で異なることが分かると思います。これは意図的な切り取りがなくても発生します。例えば、同じ会議室で、発言者が「発話A」を発したとしても、聞いている人が別であれば、別の発話を受け取ります(これ、音波的には同じもなのか?という問題もあるけど、まあ、音波であっても違いますよね)。

ただし、発話Aを受け取った人は、微妙に異なる「発話A’」と「発話A’’」を受け取りますが、この差異はあまり大きくありません。マスコミやツイッターなどの意図的な切り取りは別なのですが、同じ場所で同じ発言を聞いていれば、多少は差異はあるけれども、ほぼ同じものを着ている。あとから「発話A’」と「発話A’’」を比較しても「発話A」を再現できる程度に正確に聞き取れているでしょう。

しかし、これを理解するための「解釈」の段階になるとことなります。それぞれの「知識B」と「知識C」が大きく異なるため、理解するための「解釈 A’+B」と「解釈 A’’+C 」は異なる可能性が高いのです。これが同じ発言を聞いても「空疎」と「意味深」が同居する理由です。

まあ時には、「空疎」だけど「意味深」という形で同居する解釈もできるので、それは頭の中で「知識B」と「知識C」を切り替えて2つの解釈を割り出す方法です。

これを発言側から見れば、相手の知識Bと知識Cに向かって「解釈が異なる」ことを利用します。つまり、相手に「知識B」があると仮定したうえで、漠然とした発話Aを発します。知識Cの人にとっては訳がわからないのですが、あらかじ知識Bの人は「受け答え」をします。この受け答えを以って、相手が「知識B」をもっていることを発言者は知ることができるのです。この問答は、試験官と面接者の関係に似ています。異なるのは、発言者Aは、あらかじめ「知識B」の全体をしらなくても、それとなく知識Bが回答させられるように、発言Aを「漠然と」言うということです。そして、発言者Aは、まんまと知識Bの概要を得ることができます。

一見、ややこしいように見えますが、よく親が子供に対して「今日、何かあった?」という聞くよりも、「今日の国語のテストはどうだった?」とカマを掛けるのと同じです。国語のテストがなければ、子供は「国語のテストなんかないよ、何言ってんの」と言うでしょうが、ちょうど国語のテストがあれば、隠していたテストの結果を出してくるでしょう。親の側では、国語のテストがあってかどうかを知らずに、国語のテストの結果を得られます。

こんな感じなのが、ホット・リーディングの会話テクニックなのですが、このあたり先天的に(というか家系的に?)無意識でやっている人たちもいるので、対抗手段を講じるのは必要でしょう。私的には無意識でやっているのは進化論のひとつだと思うのですが、その話はまた別の機会に。

カテゴリー: 雑談 | 掌握術のコールド・リーディングの話を少し はコメントを受け付けていません

ラズパイ3 と Wii リモコンをつなげる

台風が近くまで接近しているので、非常に眠いので眠気覚ましに。

世の中は任天堂スイッチの世界なので、Joy-Con で操作することが多いと思うのですが、Joy-Con はちょっと高い。正規版だと 8,000円位しますね。互換機?(バイブレータがないらしい)の場合だと、もうちょっと安いみたいなのですが、まあ、手元に Wii コントローラがあるし、試しにつなげてみようというところです。

以前、ラズパイに Wii コントローラをつなげようとしたとき、古い Wii リモコンだとうまくいくのですが、新しめの Wii リモコンプラスだとペアリングがうまくいきません。Bluetooth 側のプログラムを改変すれば、接続はできるのですが、それがいいのかどうか不明だったので放置状態でした。

bluetoothctl と xwiimote を使う

ラズパイ3 に xwiimote を入れて使います。
ラズパイ3 の Raspbian には既に bluetooth に接続するための bluetoothctl があります。



sudo apt install bluez

した後で



bluetoothctl

を実行します。プロンプトが出るので、



power on scan on

で接続先の Bluetooth 機器を探します。

このときに、Wii リモコンの裏側の赤いボタンを押して、接続待ち状態にしておくと、Nintendo RVL-CNT-01-TR のデバイス名が出てきます。ここに出てくる ID を使って、



pair 9C:E6:35:04:51:4A connect 9C:E6:35:04:51:4A trust 9C:E6:35:04:51:4A

して接続をします。

これで、Bluetooth 接続状態にしておいて、xwiishow コマンドを使います。



sudo apt install xwiimote

してインストールした後に、



xwiishow 1

で Wii リモートの操作画面を表示させます。

A,Bボタンの操作や、加速度センサー、IRセンサーの値が表示されています。

詳しい使い方は、下記を参照

XWiimote – ArchWiki

どうやって Wii リモコンの処理ををするのか?

Linux なのでデバイスはファイルとして開かれるので、/sys/bus/hid/devices で調べられるそうです。



pi@raspi3:~ $ ls /sys/bus/hid/devices 0005:057E:0330.0002 pi@raspi3:~ $

たぶん、xwiishow のあたりから API が出てると思うのだけど、これは後で。

コードがここで公開されています。
GitHub – dvdhrm/xwiimote: Open Source Nintendo Wii Remote Linux Device Driver https://github.com/dvdhrm/xwiimote

PC の場合は、WiimoteLib というライブラリがあるそうです。

Siv3DでWiiリモコンを使う – Qiita

カテゴリー: 開発 | ラズパイ3 と Wii リモコンをつなげる はコメントを受け付けていません

ラズパイ以外でもROS2してみよう(PINE A64編)

去年の年末 年末なので ROS を調べてちらほらと | Moonmile Solutions Blog 以来さわっていない、ROS2 なのだが、通信まわりだけでも再構築しておこうと思った記録を残しておきます。

ROS2 のインストールに関しては WEB で色々調べると出てくるのだけど、ROS(いわゆるver.1)と、新しい ROS2 が混在してしまって、ややこしいことになっている。インストールと最初の諸々に関しては、次の本を買ったほうが時間の節約になります。

ROS2ではじめよう 次世代ロボットプログラミング
https://www.amazon.co.jp/dp/4297107422

Kindle 版だと3,000円ちょっとだし、半日時間をつぶしてあれこれ調べるよりも(実際に潰してしまった…)、この本を買ったほうが早いでしょう。

とは言え、最初のインストール部分だけ抜き出せば、Raspberry Pi 3にROS2をインストール – RT Robot Shop Blog にある通り、


export CHOOSE_ROS_DISTRO=dashing sudo apt install curl curl http://repo.ros2.org/repos.key | sudo apt-key add - sudo sh -c 'echo "deb [arch=amd64,arm64] http://repo.ros2.org/ubuntu/main `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list' export CHOOSE_ROS_DISTRO=dashing sudo apt update sudo apt install ros-$CHOOSE_ROS_DISTRO-ros-base sudo apt install python3-argcomplete sudo apt install python3-colcon-common-extensions

で、最初のインストールまでは完了です。これで、ラズパイ3と Windows 10 上の Ubuntu(WSL:Windows Subsystem for Linux) の両方でインストールができます。

公式は ROS Index: Installation になるので、何か困ったことが起こったら、ここを見るとよい。英語だが、コマンドが羅列されているだけなので、なんとかなるでしょう。

あと、ラズパイ3 への Ubuntu は 64bit 版が必要なので、http://cdimage.ubuntu.com/ubuntu/releases/bionic/release/ubuntu-18.04.2-preinstalled-server-arm64+raspi3.img.xz を使うことになります。

通信だけ試してみる

ROS2 には、ロボットアームのエミュレーションとか各種センサーのコンポーネント化とか、GUI も含めてロボット開発には必要な機能が満載なのですが、私の場合、通信部分だけが使いたいので、通信だけやっていきます。
最終的にはロボットアームの制御と、3Dプリンタ、PLAN2 の ROS2 化までやりたいのだけど、(何度も失敗しているので)小さく始めるということで。

ROS2 は、Publisher/Subscriber方式で通信をしていて、日本語で言えば「出版-購読者」のパターンです。GoF で言えば「Subject/Observer」だったりしますね。ROS1 のときは仲介サーバーが必要だった(ハズ)のですが、ROS2 は P2P で繋がるようになっていてシンプルになっています。

ROS2 をインストールして最初にやることは、ターミナルを2つ開いて、

Publisher側


ros2 topic pub /chatter std_msgs/String "{data: Hello world.}"

Subscriber側


ros2 topic echo /chatter

で動かすことです。

※ 実際は、環境変数の設定があるので、以下を動かしてパスを通す。あとデモ用のパッケージをインストールする


echo "source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash" >> ~/.bashrc source ~/.bashrc
  • Windows 上の ROS2(実際は WSL上の ROS2)
  • PINE A64 上の ROS2

とで通信ができることが分かる。この2つは同じネットワーク上で使われていて、それぞれの IP は「どこにも設定していない」のがミソで、仲介役があって何か IP とかを送っているわけではない。これはかなり便利。

PINE A64 の Ubunut で試す

PINE A64 ってのは、ラズパイ3のようなマイコンボードで、ちょっと大きめの中華ボード。秋月で 3,000円位で買える

ボード自体が大きいのと、USBが2個しかないのが難点なのだけど、

  • ラズパイよりも価格が安い
  • ラズパイ3よりも性能がいい(らしい)

ところがある。まあ、Android を動かしたかったので、PINE A64 を購入したのだけど、今となっては Android のバージョンが古くなってしまったので、ちょっと放置状態。

PINE A64 も armbian に Linux OS がある。

Pine64 – Armbian

これは、最初から 64bit 対応になっているので、64bit が必須となる ROS2 がそのまま使える。と言う訳で、Ubuntu 環境で arm64 を用意すれば、

  • ROS2 が使える
  • .NET Core 3 が使える

という形になっている。たしか、React Native も 64bit 環境が必須だったと思うので、PINE A64 や ラズパイの Ubuntu 環境でも動くでしょう。

お次は、C++ で ROS2 のパッケージを作って動かしてみましょう…ってのは後日。

カテゴリー: 開発, ROS | ラズパイ以外でもROS2してみよう(PINE A64編) はコメントを受け付けていません

リモートデスクトップでラズパイに接続する

Windows からラズパイにリモート接続する方法はいくつかあって、

  • VNC を使う
  • Xming を使う
  • リモートデスクトップを使う

という方法があります。昔から、定番は VNC でラズパイ側に VNC サーバーを起動させておいて、Windows で VNC Viewer を使うという方法ですね。

比較的安定しているし、LAN 内でも結構遅くて苦痛なのですが、画面全体を操作する場合は仕方がないということで使っています。

Xming のほうは、Windows 版の X サーバーを入れて操作する方法で、Xming X Server for Windows 日本語情報トップページ – OSDN かなりバイナリが古いのですが、Windows 10 上でも軽快に動きます。xterm だとか、X Window に対応しているソフトをラズパイ側に入れておくと動きます。

で、実は、昔から Windows のリモートデスクトップを使う方法があったのですが、結構遅いし、日本語入力が打てないとかいう問題がありました(ラズパイ側に wnn とか入れればいい?)。ですが、今だと軽快なスピードで動きます!何が変わったのか?単に CPU スピードが速くなったのか?
少なくとも VNC Viewer だと遅くて辛いのですが、リモートデスクトップだと全然問題ありません。

インストールは簡単で、ラズパイ側に xrdp を入れるだけです。


sudo apt install xrdp

Windows からリモートデスクトップで接続すると、xrdp のログイン画面が出ます。

session は X.org のままにしておいて、ログインすれば ok です。

画面はちょっともたつきますが、設定とか Scratch ぐらいならば全然 ok ですね。ssh でつなげてコンソールで設定するのもいいんですが、GUI があると楽です。

特にラズパイの場合は、HDMI 接続せずに LAN ケーブルつけて放置(あるいは WiFi 接続のみ)することが多いので、ちょっとした GUI の設定が必要なときに便利です。

ちなみに、Ubuntu にも xrdp を入れると普通に接続できます。

Ubuntu(うちのは 18.04)に xrdp を入れるだけでリモート接続できるのでお手軽です。Ubuntu のほうは日本語入力が使えます。VSCode も軽快に動きます。

カテゴリー: 開発 | リモートデスクトップでラズパイに接続する はコメントを受け付けていません

俺のOrange Pi One に .NET が(以下略

Raspberry Pi 3 で .NET Core 3 が動くならば、ラズパイ互換の Orange Pi でも動くだろう、と思って確認してみたのがこれです。

結論から言えば、前回 と同じように、.NET Core 3 preview をインストールすると、ラズパイと同じようにビルド&実行ができるようになります。

Orange Pi One とは何か?

Orange Pi One ってのは、こんな感じのラズパイ互換機です。

ラズパイ3だと、USBコネクタが4つあったり、BluetoothやWiFiが乗っていたりするのですが、Ornage Pi One は、USB コネクタが1個だけなのと、BluetoothやWiFiがありません。ちっとばかし不便な気もするのですが、ラズパイ3が5,000円強かかるのに対して、Orange Pi One は1,000円位で済みます。

orange pi one – Orangepi

Orange Pi One H3 512MB Quad core Support ubuntu linux and android mini PC-in Demo Board from Computer & Office on Aliexpress.com | Alibaba Group

以前は、公式?な販売サイトが Ornage Pi のサイト内にあったのですが、今は Aliexpress の中にあります。正規がここらしいので、郵送諸々は問題ありません。中国の深圳から中国郵便で送られくるので、約1週間位で届きます。長くても2週間弱ですね。

OS は Armbian を使う

Orange Pi シリーズはラズパイよりも多種多様なものがあって、用途によって性能が低くても安いのから、ちょっと性能が高くて高めのものまで様々です。OS は、Linux 系のものが動くのですが、公式からダウンロードするとバージョンによって起動しなかったり、そもそもダウンロードができなかったり(リンク先が切れている場合がある)するので、Armbian のものを使います。
Armbian は、ARM 系のマイコンボードに OS をビルドしてくれている有志の集団です。いわゆる、ラズパイ互換の中華ボードは、大抵揃っているので Armbian からダウンロードして使うとよいです。

Orange Pi One だと以下からダウンロードができます。

Orange Pi One – Armbian

最近は Ubuntu と Debian を利用できるようになっています。

この armbian で配布しているディストリビューションは、自前でビルドすることもできて、手順などが Building Armbian – Armbian Documentation に書かれています。ビルドしたことはないんですが…いずれ。

.NET Core 3

.NET Core 3 preview 版を入れて、dotnet new mvc -n web で作成して dotnet run したところまで。


見るとわかるのですが、Orange Pi One のメモリは 512MB しか(?)ありません。まあ、昔の Linux に比べれば断然大きいのですが、動画のエンコードとか機械学習の用途には無理ですね。さて、これは何に使うか。

カテゴリー: 開発, NET Core | 俺のOrange Pi One に .NET が(以下略 はコメントを受け付けていません

俺のラズパイ3で.NET Core 3.0 preview が動くまで

俺のラズパイ2で.NET Core 2.0が動くまで | Moonmile Solutions Blog

前回、ラズパイで .NET Core 2.0 が動いたのだが、セルフビルドができない(後から見れば .NET Core 2.1 で ARM32 対応になっているのだけど)と思ってみたものの、.NET Core 3 ならば大丈夫、という訳でメモ的に。

現時点の v3.0.0-preview8 を使うと Raspberry Pi 3 上で .NET Core でビルドができます。今まで、ラズパイ上でできなくても PC でクロスビルドしてから転送すればよかったので、動くと言えば動くのですが、やっぱり dotnet build ができないと「手軽」とは言えませんよね。手軽じゃなかったら、nodejs を使うか、python を使うか、PHP で Laravel か React を使ったほうが便利なわけですが、ひとまず、.NET Core 3 になるとビルドができます。

ダウンロードしてインストールする

Download .NET Core 3.0 (Linux, macOS, and Windows) https://dotnet.microsoft.com/download/dotnet-core/3.0

ここから SDK の Linux の「ARM32」をダウンロードします。

ラズパイへ WinSCP などで転送できたら、tar で展開します。



mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-3.0.100-preview8-013656-linux-arm.tar.gz -C $HOME/dotnet export DOTNET_ROOT=$HOME/dotnet export PATH=$PATH:$HOME/dotnet

export のところは、~/.bashrc に書いて、常にパスを通しておきます。

dotnet new mvc する

ラズパイで .net core を使って HTTP サーバーを動かすパターン



$ dotnet new mvc -n web

すると動きます。.NET Core な読み込みにひどく時間がかかる(1分以上?)のですが、まあ、立ち上がれば何とか。


blazor する

.NET Core 3 の目玉機能である Blazor も動きます。Blazor は WebAssembly 上に .NET Core を乗って動かす SPA です。


laravel する

ついでに、PHP を入れて laravel してみます。


Laravel と Vue.js の相性は良いので、これも nodejs を使って SPA を作れます。

wpf や winforms してみるが駄目

もうひとつの .NET Core 3 の目玉機能として、Linux の環境で WPF や WinForms が動くという(噂?)があります。


一応、テンプレートはあるしプロジェクトは作れるのですが、Windows 上でしか動きません。これだと、Windows 上で .NET Framework を使う場合と同じじゃないか?と思うかもしれませんが、どうなんでしょう?

まあ、.NET Core と .NET Framework は、来年の秋頃に統合されて .NET 5 になるそうなので。

Introducing .NET 5 | .NET Blog

というわけで、まだラズパイ4は手に入れていないので、ラズパイ3での動作確認を。

カテゴリー: 開発, NET Core | 俺のラズパイ3で.NET Core 3.0 preview が動くまで はコメントを受け付けていません

Windows Update のない世界 Linux へ(サーバーだけ)移行しよう

うちの仕事の環境は、基本 Windows で揃えているのですが、一番の難点は Windows Update です。別口で Windows Server を使えばいいのでしょうが、これは私にはオーバースペックだし、そもそも別口でサーバーを揃える位ならば、Linux を使える環境を用意したほうがよかろう、ってのが主旨で、

サブ開発環境を Ubuntu 18.04 で準備する | Moonmile Solutions Blog

去年の夏に Linux 環境を整えました。仕事柄 Visual Studio が必須なのと、仮想環境がワンセットになっていないと辛い(Windows 7 とか、別の Linux 環境とか)ので、メモリを増加させて相乗りをさえていた訳ですが、月1に訪れる「Windows Updateによる再起動」が辛い。

会社で使う業務PCならば、帰宅時に電源を落とすというのが普通なのでしょうが、

  • 機械学習させているときに、数日間廻しっぱなしにする必要がある
  • バックグラウンドで仮想環境(VMWare)が常に起動している
  • バックグラウンドで Docker が常に起動している

ということになると、不意にやってくる Windows Update による再起動は結構な痛手です。暫くはタイミングを見て手動で再起動(VMWareも手作業でスリープさせる)というのを繰り返していたのですが、去年の春あたりから「勝手に再起動」が頻発してしまって、あまりに耐えかねて Linux マシンを用意しました、ってのが去年の夏です。

構成などは、さきのブログを見て貰うということで、1年間 Linux サーバーとして動作させた感想をメモしておきます。

なんといっても再起動しないのが良い

目的が「再起動させない」なので、Linux マシンは24時間運用です。電力的にどうか?という話しもありますが、私の場合は仕事場が自宅なので、利用時間はこれで良いのです。
単純な NAS や自宅 WEB サーバーならば、Raspberry Pi でも良いのですが(あるいは Orange Pi などの互換機でもOK.),仮想環境として VMWare を動かすのが前提だってので、通常の PC を用意します。メモリはそれなりに潤沢に置いて、CPU はそこそこ、直接画面を見ることはないのでグラフィック関係はオンボードのものを利用しています。

Linux サーバーには普段はモニタはつけていなくて、VNC で接続します。実は VNC での画面更新は非常に遅いので、VSCode などを使った編集が難しいのがデメリットなのですが、そこは Telnet でつなげて vi なり emacs を使います。

業務上、常に VMWare 上で Windows 7 が動作しています。裏で見えているのが保守しているシステム(旧顧客環境のため Windows 7 が稼働している)、手前にあるのが VSCode ですね。絵文字もカラーで綺麗にでます。ただし、VNC 経由だとキーボードの反応とかが極めて遅いので、基本は、

  • telnet で vi を使ってコードを書く
  • WinSCP を使ってファイル転送
  • samba を使って Windows とファイル共有

ってことをやります。VMWare 上で動いている Windows 7 は、そのままリモートデスクトップで接続ができるので、VNC を介在せずに、業務 Windows 10 – Windows 7 間で動かせるので、通常の PC のように動かせて便利です。

Linux マシンは不意に再起動しないので、仮想環境がいきなり倒れたり、機械学習用のプロセスが倒れてたりすることはありません。まあ、実際のとこれは適度に apt upgrade するのですが、面倒?なのもあって、ここ半年ぐらいはそのままです。旧来の意味でのサーバーとしての利用ですね。

インストールするソフトウェアは最小限に

この Linux サーバーは外部に公開している訳ではないので、セキュリティリスクが低いのですが、一応、インストールするソフトウェアは最小限にしています。
最小限とはいっても、適当に動かしたいものを入れるので、

  • mysql
  • PHP
  • apache
  • java
  • dotnet

あたりが入っています。あまりたくさん入れると、再構築が面倒なのと、バージョン違いのあれこれで悩むことになるので、少な目にしておきます。
実際の業務サーバーになると、メールなりFWなりの設定が出てくるわけですが、社内(個人内)で使うものなので、ややこしい設定は入っていません。その分、再構築は楽なのです。

逆に、なんらかのテストをしたいときは、VMWare か Docker に押し込めます。VMWare にしても本格的な運用ではなく、実験的に使うことが多いので既存のものをクローンして使うだけで済みます。HDD の容量を見て、適当なタイミングで仮想環境は消してしまいます。

Ubuntu なので snap が使えるのですが、あまり使っていません。仕事柄ソフトウェアのバージョン違い、OS のバージョン違いを確認することが多いので、snap を使うよりも、VMWare で用意してしまったほうが楽なのです。

なお、仮想環境は HDD の容量を気にしてあれこれと消したりするよりも、2T HDD を買ってしまって、さっくりと増量してしまったほうがベターです。メモリも仮想環境用に 32GB まで増量させています。本当は 64GB に上げたかったのですが、結構な値段になってしまったのでランクを落としました。それでも大丈夫なのは、

  • 業務用 PC で Windows 10 で 32GB
  • Linux で Ubuntu 18.04 で 32GB

に分けられたからですね。業務用 PC のほうでは仮想環境を動かすことがなくなった(実際は、アズールレーンが BlueStacksで動いていますがw)ので、32GB でも十分になりました。

クラウド環境でもいいのでは?

自宅 Linux を作るよりクラウド環境を要したほうがいいのではないか?と思うこともあります。実際、VPS を借りたとしても、年間2万円弱でそれなりの Linux サーバーを借りられます。手元の Linux サーバーは 13万円 + 電気代がかかっているわけで、実は外部で借りたほうがランニングコストは安くなるでしょう。おそらく、VMWare 等を使って仮想環境を作らないのであれば、クラウド上に Linux や Windows を入れてしまったほうが手軽です。問題は、回線スピードなのですが、今となっては光回線が普通になってきているので、Windows 10 からリモートデスクトップで繋げても、そこそこの画面更新スピードで動くでしょう。

なので、最近となっては全面的にクラウドに持って行ってもよいのですが、クラウド環境を使う最大のデメリットは、

  • ビックデータや画像データなどの大量のデータを送り出すのに時間が掛かること

です。光回線の場合、下りのスピードは早いのですが、上りのスピードが遅いことが多々あります。なので、検索のためのデータとか、何か加工するためのデータをクラウド上にアップロードするときにかなりの時間が掛かります。転送量の価格もあるのですが、時間が掛かるのが大問題です。

手もとの Linux サーバーだと、HDD を USB でつなげるとか、社内ネットワーク越しにコピーするとかで相当にスピードでコピーができます。一番早いのは、micro SD カードか外付けの SSD にコピーして USB 3.0 経由ですね。
なので、業務的にデータの秘匿性が高くはなくても、オンプレミスで Linux サーバーを運用させるメリットはそれなりにあるわけです。まあ、オンプレミスの場合には、SE 役が必須なわけですが…ひとまず、自宅 Linux の場合は自分な訳だし。

カテゴリー: 開発 | Windows Update のない世界 Linux へ(サーバーだけ)移行しよう はコメントを受け付けていません

クソコードとマイナス生産性の関係

定期的に発生する「クソコード」発言問題だけど、新人の未熟なコードよりも(自称)熟練者のクソコードのほうが害が大きいので、さりげなく「クソコード」というようにしている。例えば、

  • こんなクソみたいなコードを残してしまうと、未来に禍根を残すし
  • 使う身になってみれば、クソみたいなAPIを公開されても誰も使わないし
  • こんなクソみたいなUIは誰も使わなくなるから、削ったほうがコストが安くなりますよ

とかとか。以前は汚物用語は使わないようにしていたのだけど、なぜかインパクトが薄く(自称)熟練者には届かないようなので、時に散弾銃のように混ぜるようにしている。ちなみに、さりげなく「クソ」を混ぜると、当たらない人には当たらずにスルーされる。本人だけには分かるようなので、顔が少し赤くなるので判別がつく。
また、「クソコード」を言うときは、本人に対して言うのではなく、

  • ディスプレイのコードを示しながら、「ここのクソコードなんですけどね」とか
  • 印刷したコードにアンダーラインっぽい「削除ライン」を引きながら「ここのコードなんですけどね」

とやる。コードを書いた本人が悪いのではなく、悪いコードを修正しない当人が悪いという示唆である。プログラマは職人的な能力が問われるので、日々進化する。だから、数日前に書いたコードは、自分が未熟だったゆえに(ものを知らなかったゆえに)書かれたコードであれるのだから、数日後にものを知ったあとで直せばいいのだ。
だから、直せばOK. 直さないのは何かが「クソ」なのだから。

何を参考書にする?

コードレビューに関しては、この2冊があれば十分である。

「ソフトウェア インスペクション」は、IBMで育ったレビュー方式で、厳密にレビューの仕方が規定されている。ざっくりと集まって、ざっくりと(自称)熟練者が新人に対して評価を下すのではなく、レビューを行う品質管理担当がいて厳密に手順を決めておく。きっちりと行うには、IBM ぐらい大きな組織でないと難しいのだが、レビューする日を別に定めて、レビューを記録しながらやると同じような効果が得られる。
最大のポイントは、レビューをするものが事前にレビューをしておくことだ。レビューをするために長い時間取られるが、それだけの効果があるし、なによりも面と向かって言うのではなく、あらかじめ紙面に書いておくことで感情的にならずに済む。また、面と向かったときには「何を基準にして駄目なのか」を明確に言えるようにしておく必要がある。

「ピアレビュー」は、インスペクションよりも緩く、一般的なレビューよりも丁寧なものを示している。コードを前にしてピンポイントで進んでいくのではなく、頭から最後まで通してコードを読み進め、レビューをしていく。このローラー作戦を遂行することで、コードの品質が「標準的」になるのが、ピアレビューの特徴である。コードが標準的になると、他の人から読みやすくなるし、保守もしやすくなる。改修コードを入れるときにも、既にあるコードになじむように「補修」あるいは「補完」することによって、全体の質を同じに揃えることができる。

マイナス生産者を排除するためレビューを行え

一般的に、コードレビューは

  • コードの品質を上げる
  • 新人が作ったコードの間違いを直す

という目的で行うことが多いのだが、最近の新人プログラマはそれなりにプログラムコードを勉強しているし、30年前とは違ってプログラム言語も豊富になってきたので、極端に不味いコードが出てくることは少なくなっている…と思う。会社に属さなくなって10年以上経つので、ほんとうのところはどうなのか分からないのだが(いやいや、頭でっかちな新人っぽい人はちらほら見るので、それなりの「ぴよぴよコード」はあるとおもうのだけど C#のぴよぴよコードをなんとか使える形にするための2つの方法 | Moonmile Solutions Blog)。
と、その前に(自称)熟練プログラマが陥りがちな「クソコード」のほうが有害である。どんなところが有害かというと、

  • 「クソコード」を書いた人にしか分からない、クソ理論でコーディングされて、誰も理解できない。
  • 「クソコード」を書くために、クソみたいなライブラリを付随されていて保守性が悪い
  • 業務システムの場合、テスト費用、保守費用が別途かかってくるので、それを増大させるのは全て「クソコード」である。

という点があげられる。個人開発をしていたり、ずっとその会社でライブラリを作り続けていたりするのならばいいのだが、ある程度の大き目の業務システムになると、複数名が関わらざるを得ない。なので、良かれと思ってコードを改修していていても、それは「クソコード」になり得るし、実際に「クソコード」となってしまう。
よって、クソコードは「レガシーコード」よりも低位にある。逆に、先に書いた通り、クソコードは直せばふつうのコードになる。だから、「直さないクソ」な人がクソコードを生み出す≒マイナス生産者である、という話になるのだ。

「ピープルウェア」にある通り、マイナス生産者は清く排除するのがよろしい。あるいは隔離だ。その方法いくつか逆引きにも書いたし、どこかで検索すれば出てくるだろう。

自称熟練者のクソコードの例

自分の過去のコードを見れば、いくらでもクソコードが出てくる。なので、私の書いたクソコードを紹介しておこう。



static int hxx_number = 0; ... int HXX_get_NUMBER() { return hxx_number ; }

その昔、UnixにC++がなくてC言語しか使えなかったとき(まだg++はなかった)に、オブジェクト指向風にメソッドぽいものを作ったクソコード。呼び出し側は、HXX_get_NUMBER 関数で値を取るわけだが、いやいや面倒くさいし、中身が何か分からない。中規模程度であれば、hxx_number を直接参照したほうが可読性がよいだろう。
可読性がわるくなるので、コードを引き継いだ人が迷惑するクソコードだ。



struct DATA data ; for ( int i=0; i<2; i++ ) { ... data.array[i] = 0 ; }

構造体のデータを0で初期化する例だが、for文で2つまでか使わないのは無駄だ。arrayが可変ならば必要かもしれないけど、そもそも「2」を即値で置いているのが駄目だろう。素直に、array[0] = 0; array[1] = 0 ; で十分だし、C言語だから memset( &data, 0, sizeof(data)) と memset を使ってゼロリセットするほうがよい。



$h = $this->params['data']['Reservation']['CompletionTime']['hour']; $m = $this->params['data']['Reservation']['CompletionTime']['min']; if ( $this->params['data']['Reservation']['CompletionTime']['meridian'] == 'pm' ) { $h += 12 ; if ( $h == 24 ) { $h = 12; } } $CompletionTime = "$h:$m"; $h = $this->params['data']['Reservation']['StartTime']['hour']; $m = $this->params['data']['Reservation']['StartTime']['min']; if ( $this->params['data']['Reservation']['StartTime']['meridian'] == 'pm' ) { $h += 12 ; if ( $h == 24 ) { $h = 12; } } // 入庫時刻の補正 if ( $h == 12 && $m == 1 ) { $h = 0; } $StartTime = "$h:$m"; $CustomerBilling = $this->params['data']['Reservation']['CustomerBilling']; $y = $this->params['data']['Reservation']['AcceptanceDate']['year']; $m = $this->params['data']['Reservation']['AcceptanceDate']['month']; $d = $this->params['data']['Reservation']['AcceptanceDate']['day']; $AcceptanceDate = "$y-$m-$d"; $Remarks = $this->params['data']['Reservation']['Remarks']; $Scene = $this->params['data']['Reservation']['Scene'];

これは、PHPをよく知らないときに作ったコードなのだが、日時変換が駄目過ぎて泣けてくる。いわゆる「自称熟練者」がプログラム言語の流儀をよく調べずに、ひとつだけの金づちでなんとかしようとした悪い例である。WEB APIのGET呼び出しなので、今ならばJSON形式のGMT表記で一発で変換できるパターンである。実際、ここは結合テストをすり抜けてしまって運用時にバグが発覚したものである。つまり、クソコードが被害を出してしまった好例?だ。

個人開発や少人数開発であれば、どんなトリッキーなコードを書いてもいいけど(自分がわかるならば)、小規模であっても製品にする場合や複数名でコードを弄るときには、できるだけ「平坦なコード」を書くのがよい。それはコードの標準化とか、共通ライブラリの利用とかいう上辺の話だけではなくて、コードの質を揃えて資産化するという意味でだ。本格的にはMDAとかもうちょっと模索が必要なところだけど。

カテゴリー: 開発 | クソコードとマイナス生産性の関係 はコメントを受け付けていません