Raspberry Pi で作るネットワークエミュレータ

明けましておめでとうございます。

この記事は、 Raspberry Pi Advent Calendar 2020 24日目の記事だ。
…遅刻すぎるのもいいとこだわ。


さて、ネットワーク回りの仕事をしていると、意図的にネットワークの遅延やパケロスを発生させて、検証したくなる状況がままある。

対象のサーバーにネットワークを遅延させるようなモジュール入れるようなやり方も考えられるが、もっと手軽に、 LAN ケーブルの間に挟むだけで、そこを通る通信が全て遅延するみたいな、そんな機材が欲しくなる。

もちろん、そのような需要があれば、それに応える製品があるわけで、それらは一般的に「ネットワークエミュレータ」として売られている。
しかし、高いものでは数百万を軽く超え、安くても数万円はするものばかりだ。

なんか安く作れないかなぁ…
Raspberry Pi あたりで。

…ということで、 Raspberry Pi 4 を使って、遅延とパケロスを制御できる、お手軽ネットワークエミュレータを作ってみよう。

先駆者

そもそもなのだが、そのものズバリなことを実践している先駆者様がいらっしゃった。

この記事の Raspberry Pi には、小型ドットマトリックス LCD ディスプレイや、様々な物理キーが GPIO に繋がっていて、 THE IoT という仕上がりになっている。

かっこいいと思う。
でも、電子工作するのめんどくさいよね。

GUIで手っ取り早く作る

そんな複雑 (…というほど複雑でもないけど) な電子工作しなくても、 RasPi にタッチパネルディスプレイつけちゃえばいいじゃん。
…ということで、 Amazon で割と評判のよい、 OSOYOO の 2,980円 タッチスクリーン付き LCD を取り付けて、めっちゃ簡単な UI をつくってみよう。

OSOYOO(オソヨー) HDMI 3.5 インチ LCD ディスプレイ IPS モニター IPSタッチスクリーン 1920x1280ハイビジョン Raspberry Pi 4 3 2 Model B に対応 (3.5" HDMI LCD+クリアケース)

もはや、 IoT 感を感じるのが難しくなってしまっているな……

続きを読む

.NET Interactive で C# と PowerShell を股に掛ける

この記事は、「C# Advent Calendar 2020」 9日目の記事、かつ 「PowerShell Advent Calendar 2020」 9日目の記事だ。

スミマセン。横着した。

この時期になれば .NET Interactive の Preview 4 が出てるだろうしその記事でも書こうかな~ などと目論んでいたものの、 残念ながら登場しなかった。

このため、 .NET Interactive .NET 5 対応版の導入と、 Variable sharing の内容でお茶を濁そうと思う。

.NET Interactive のなんたるかについては、以前の以下の記事で取り扱っているので、そちらを参照願いたい。

.NET Interactive を .NET 5 で動かしてみる

いきなり本題とは関係ない話になるが、 せっかく .NET 5 がリリースされたところなので、 .NET Interactive を .NET 5 で動かしてみよう。

続きを読む

[v2021.6.15s 対応] Among Us 用超便利 Discord bot “AutoMuteUs” をセルフホストする方法 (公式推奨簡単版)

注: この記事は、 2020年11月23日~25日 時点の話を基にして、 一部 2021年7月 現在の内容に更新しているよ。 状況は今後も刻々と変わる可能性が高いよ。
なお 7月9日 現在、 Among Us バージョン v2021.6.30s では、 以下の手順で問題なく動いていることを確認している。

うまく動かすコトができない場合は、記事の最後にトラブルシューティングも用意したので、そちらを参考にして欲しい。


2020年の夏あたりから、日本でも爆発的なブームが続いており、 宇宙人狼, アモアス 等とも呼ばれている Among Us

Discord でボイスチャットしながらやるのが面白いのだけれど、 ゲームの仕様上、ミュート管理が結構面倒だ。

そこに、 Among Us のゲーム画面に同期してミュート管理を超いい感じに自動で行ってくれる Discord bot が存在する。

それが AutoMuteUs だ。

このツールは、 以前は "AmongUs AutoMute" などとも呼ばれ、 誰か一人が Windows Steam 版 Among Us のゲームと一緒にキャプチャープログラムを立ち上げ、 公式の Discord Bot と連携させるだけで超お手軽に使える…
…はずだった。

1月下旬現在、 AutoMuteUs 公式の手順に従って、 bot の .au new コマンドでゲームを作成しようとすると、以下のような悲しいメッセージを目にするだろう。

If I start any more games, Discord will lock me out, or throttle the games I'm running! :frowning:
Please try again in a few minutes, or consider AutoMuteUs Premium (.au premium)
Current Games: 151/150

Discord 側の制限で、これ以上 bot を実行できないって。
しばらく待つか、有料の AutoMuteUs Premium を使ってくれとのこと。

そして、仮にゲームの作成が無事にできたとしても、 bot のミュート変更が遅れたり、変更しそびれたりと不安定だったり…

そこで、 AutoMuteUs のサーバーを自分で実行 (セルフホスト) することで、上記の制限を無料で回避してしまおう というのが、この記事の目指す内容だ。

記事内では画像とテキストで導入手順を解説しているが、 それだけではわかりにくい場合、 こちらに本記事の内容を解説する動画も作成しているので、併せて見ていただくとわかりやすいだろう。

ちょっと古い v2.4.3 をセルフホストするのが推奨

続きを読む

Raspberry Pi に Ubuntu を入れて SSH でログインするまでの A to B

何番煎じかわからないが、 Raspberry Pi (以下、 RasPi) に Ubuntu を入れる手順についてまとめてみようと思う。

Ubuntu 公式の How to install Ubuntu on your Raspberry Pi チュートリアルは充実しているし、 単にインストールして動かすだけなら、既にある記事でも十分だろうとは思う。
しかし、初回セットアップ時の細かいカスタマイズについて書かれているものがあまり見当たらず、 ディスプレイなし かつ Wi-Fi 接続のセットアップ方法などを、詳しく解説されているようなものが見つからなかった。

本記事では、それについて補足しながらまとめていく。

先に断っておくが、 cloud-init による IaC の話が中心になる。

TL;DR

  • 焼いた SD を RasPi に挿すにブートプロセスの設定を書き換える
  • cloud-init の挙動を理解しろ
  • ディスプレイなし & 無線LAN Only だと、工夫がいる
  • ARP リクエストのブロードキャストが届かないと苦労する

きっかけ

続きを読む

激安液タブPC: CHUWI UBook 11.6″ CWI509 お絵かきレビュー

親戚が簡単なお絵かきができる 2-in-1 タブレット PC を欲しがっているということなので、 セールしていた CHUWI UBook を入手してみた。

中華PCを人にオススメするのもどうかとは思ったが、一応 技適もとってる 日本向けのモデルだし、予算と目的がバッチリ一致するので、お絵かき用途ならこれでいいかなと。
10万近くかけて高いノートPC買うほどではものの、そもそもプライベートの PC も持ってないらしいので、基本的人権のメモリ 8GB はある安いの探してたのよね。

買ったマシンのキッティングを行うにあたって、 Windows OS 搭載の一体型液タブとして見てどうだったのかをレビューして見ようと思う。

購入したモデル

今回購入したのは CHUWI UBook と言うモデル。

主なスペックは以下の通り。

続きを読む

.NET Interactive の C# REPL を Jupyter で

今回は、 .NET Interactive を利用し、ローカルマシンで C# や PowerShell Core の REPL を利用するまでをまとめる。

なお、 とりあえず動かしてみたいだけであれば、 Binder バッジのリンクをクリックして、 オンライン上の Binder にブラウザにアクセスするだけで、利用することができる。
Use Jupyter with .NET Interactive on Binder

.NET Interactive とは

.NET Interactive は、 以前 Try.NET と言う名前で提供されていた、 .NET のインタラクティブな機能を提供する API スイートだ。
JupyterLab に .NET カーネルを追加する形で、 REPL の実行やノートブックの作成する仕組みを提供することが、 主なユースケースとなっている。

REPL ではコード補完も効くので、非常に便利なものになっている。

Jupyter について

まず、 Jupyter についても軽く説明しておく。
既にご存じなら読み飛ばして欲しい。

JupyterLab とは?

続きを読む

OPPO Reno A のカメラの結露の水滴が取れないことに四苦八苦した話

久々にしょーもない話をひとつ。

ある日、自分のスマートフォンを見たら、前後のカメラのレンズの部分結露して、水滴がついてしまっていた。

そのスマホで写真を撮ってもごらんの有様↓

大きな寒暖差がある冬場の季節でもないし、そもそもこのスマホ (OPPO Reno A) は防水であり、最近 SIM カードスロットを開け閉めした覚えもない。
どこから水分が入ってしまったのか…

思い当たる節と言えば、先日このスマホに石けん水がかかってしまったことぐらいだろうか。
多分それだな。
(※ 「石けんで洗える」などと特記されているもの出ない限り、防水であっても石けん水だとパッキンから流入してしまうことが多い。 また、そもそもとして防水であっても防湿ではない。)

とりあえず乾燥剤とともにジップロックにぶち込む

原因はともかく、とにかく症状が悪化してしまう前に、なんとか本体内の水分を取り除きたい。

幸いにも、私は過去にも数々の電子デバイスを水没させてきた実績があるので、このようなことは慣れたもの。

スマホの SIM カードを入れるパッキンを取り外して、 いつものように乾燥剤とともにジップロックにぶち込んで一晩寝かせる。


……

水滴取れてへんやないかいっ!

ドライヤーの風を、本体を傷めない程度に離した距離から(具体的には、その風を手にも当ててそれほど熱くならない状態)あててみて、内部の水分を飛ばしてみる。

暖めた直後は結露がなくなるのだが、しばらく経って温度が下がるとまた結露する。

水分の逃げ道が無くなってるな、コレ。

続きを読む

Linux や Windows で大量の nanaco ギフトを自動登録して、オトクに税金を支払う

簡単に使用できる GUI 版を作成したので、そちらの記事も参照 。


突然だが、自動車税や固定資産税などの税金を、どのように支払っているだろうか?
支払う額も大きくなりがちなので、なるべくお得に支払いたいのではないだろうか。

そこでオススメなのが nanaco ギフト だ。

クレジットカードで直接納税したり nanaco 残高にチャージする場合、手数料がかかったり、ポイントがたまらなかったりと、あまりお得にならない。
しかし nanaco ギフトであれば、額面よりも安く入手する手段が知られている。

  • ベネフィット・ステーション
    • 福利厚生型の会員制割引サービス。
    • 2020年4月現在、 毎月 10万 円分まで 額面の 2% OFF で nanaco ギフトを購入できる。
    • 所属組織による団体加入か、 「ベネフィット・ステーション プライベート」 や 「デイリーPlus」などといった個人向けの有料サービス、 「(JACCS カードの) J’s コンシェル」などの付帯サービスで利用できる。
  • Kiigo (廃止)
    • 以前はクレジットポイントを貯めながら nanaco ギフトを購入できたのだが、 2019年 に nanaco ギフトの取り扱いがなくなってしまった。
  • また nanaco 残高と違ってセンターお預かりへのチャージなので、 チャージ残高の上限が非常に高く (50万円以上も可能らしい)、 nanaco 残高のチャージ上限である 5万円を超えるような金額の支払いでも使える大きなメリットがある。

    nanaco ギフトでのお得な納税の話は、他のサイトでもっと詳しくわかりやすく書かれているだろうから、これくらいにしておく。

    nanaco ギフトの登録がめんどくさい

    さて、 ここからが本題だ。

    そんな nanaco ギフトにもひとつ 大きな欠点がある。
    それは、 1,000 円単位で提供されることが多い ということだ。

    例えば 10万円分 チャージしようとすると、 100 回も nanaco ギフトID のコードを入力しなくてはならないのだ。

    更に、 nanaco ギフトの登録を行う UI が、大量のギフト登録に とても優しくない
    1回 コードを入力する毎に nanaco にログインしたり、 コードを 4文字 ずつテキストボックスに入力しなくてはならなかったりと、 数をこなすのにとにかく手間がかかるのだ。

    10万円 の納税で 2,000円 得するために、 2,000円分 相当以上の手間をかけるのでは愚の骨頂だ。
    こうなったら、自動入力させるしかない。

    続きを読む

    Outlook の “会議室の検索” が表示されない場合の対処法

    Microsoft 365 (Office 365) など、 Exchange 上の Outlook で新しい会議を作成するウィンドウには、本来であれば 「会議室の検索」 というペインを表示させることができる。
    具体的には、以下のスクリーンショットのように、リボンの 「スケジュール アシスタント」 タブに、「会議室の検索」ボタンが存在し、そのボタンによって「会議室の検索」 というペインが切り替えられるようになっている。
    本来の表示

    ところが、一部のユーザの環境で、この「会議室の検索」ペインも、リボンのボタンも表示されない状態に陥ってしまった。
    会議室の検索が表示されない状態

    これでは、組織で作成された「会議室の一覧」などが使えず、空き会議室を探すのがとても不便で困る。

    ということで、この「会議室の検索」が消える問題の、解消法を紹介する。

    続きを読む

    Power Automate の式で property doesn’t exist となるのを解消する

    Power Automate (旧 Microsoft Flow) で式を記述して実行した時、以下のようなエラーに遭遇することがある。

    The template language expression '*' cannot be evaluated because property '*' doesn't exist, ...

    特によく遭遇するのが、 HTTP トリガーでヘッダーを参照するときだ。

    例えば、 Slack のイベント購読を HTTP トリガーで受ける時に、

    triggerOutputs()['headers']['X-Slack-Retry-Reason']

    のようにしてヘッダーの情報を参照しようとすると、 このヘッダが存在しない初回の実行時に上述のエラーが発生してしまう。

    contains(triggerOutputs()['headers'], 'X-Slack-Retry-Reason') のように、プロパティの有無のチェックの and 論理演算を加える方法 などが紹介されているが、実はもっと簡単な方法がある。

    それは、 疑問符演算子 "?" を使うことだ。
    (C# で言う Null 条件演算子 のようなもの)

    これを使って、

    triggerOutputs()['headers']?['X-Slack-Retry-Reason']

    と記述すれば、

    if(contains(triggerOutputs()['headers'], 'X-Slack-Retry-Reason'), triggerOutputs()['headers']['X-Slack-Retry-Reason'], null)

    と等価になる。

    各プロパティがオプショナルなものかどうかは、ヘルプを見ればある程度わかるものだが、メンバーアクセス演算子やインデクサー演算子を使う場合は、常に疑問符演算子を併せて使うのがよいのかもしれない。
    Power Automate のドキュメント内の "条件付きの式を使用する" などのサンプルでも、常に疑問符演算子がつけられているので。


    Power Automate のバックエンドは、 Azure Logic Apps となっているらしく、 式で使える 演算子式関数 、そして 組み込みのトリガー などに関するリファレンスが、 Azure Logic Apps のドキュメントにしか存在しない。

    また、 コネクタのリファレンス も、 Power Automate のドキュメントとは別になっている。

    同じ情報が二重三重に書かれて内容に同期が取れないような状態になるよりはマシだが、欲しい情報が探しにくいのが辛いところだ。。。