我が家にVPNを張ってみた

お勉強がてらネットワーク環境で遊んでみたくて色々やっております。今回はVPNを張ってみました。

 

まず前提として、インターネットサービスプロバイダにIIJmio (FiberAccess/NF)を利用しています。IPv6はIPoE、IPv4IPv4 over IPv6を行うDS-Liteを使用しています。が、DS-Liteはグローバル側からプライベート側への接続ができません。

 

www.mfeed.ad.jp

 

ですがこのためのIIJmioIIJmioではIPoEと同時にPPPoEで接続することができます。こちらは普通のPPPoEなので外側からのアクセスも可能。普段使うPCやタブレットはIPoE + DS-Liteで速度重視。VPN接続用はIPoE + PPPoE接続とわけることで解決できます。

 

help.iijmio.jp

 

今回このネットワーク設定を行うルーターYAMAHA製RTX1200。中古品が大量に流れている時期があり、そのときにボチりました。ルーターで行うのは概ね下記の感じ。基本的なフィルタはすでにやってあるものとします。

  1. IPoE (LAN2)の設定
  2. DS-Lite (TUNNEL1)の設定
  3. PPPoE (PP1)の設定
  4. VPN用端末のIP振り出しを固定
  5. 4で指定したIPのゲートウェイにPP1を設定
  6. VPNで使用するポートの静的IPマスカレードを設定
  7. 6で指定したポートを通過させるフィルタを設定
  8. DDNSにnetvolanteを使用 (SoftEtherDDNSサービスもあります)

ちなみにRTX1200自体にもVPNサーバー機能がありますが古いルーターなので速度が物足りないこと、クライアントとの相性があるらしいこと(特にWindows?)から別にVPNサーバーを用意しました。OpenVPNやら色々あるなかで採用したのはSoftEther。理由としては未踏ソフトウェア創造事業に採用された頃から気になってた、の一点。OpenVPNも後々触りたいのですがこちらは後回し。

 

SoftEther自体のインストールは、Linux用パッケージをダウンロードして展開。展開先のディレクトリでインストール用シェルを実行。パーミッション諸々を設定してサービスとして登録、などなど。ソースコードからのビルドになるので事前に開発環境を入れておく必要はあります。

 

qiita.com

 

インストール後に、仮想ハブを作成したりユーザーを作成したりとサーバー側の設定があります。vpncmdを使いCUIで設定するもよし、他のWindows端末からGUIツールを使うもよし。今回はL2TP/IPsecも有効にしました。既存のLANにアクセスするためにローカルブリッジも設定します。

ここでまだ理解が追いついていないのが仮想ブリッジ。VPNサーバー自体にVPN経由で接続できないという制限があり、これを回避するために仮想ブリッジというものを設定する必要があるらしいです。とりあえず今回はLAN内のNASにアクセスできればいいので仮想ブリッジの設定は保留。

 

khws4v1.myhome.cx

qiita.com

 

そんなこんなで、iPhoneAndroidからはL2TP/IPsec。PCからはSoftEtherクライアントから接続できることが確認できました。

VSCodeでC言語のフォーマットが効かない問題【解決済】

久方ぶりの記事が簡単。

 

マイコンファームウェアを実装する時、だいたいC言語な訳です。今回はPICを使おうとしておりまして純正のMPLAB Xを…と言いたいところですが、MPLABはビルド作業だけに集中させてコード編集はVSCodeで行っています。

MPLAB XはNetBeansがベースになったお陰もあり、Ver8系に比べてかなり最近のIDEという感じがしますが見た目とか軽さ、ドキュメントフォーマットやgit対応とか含めて最近はVSCode推しです。

 

余談はここまでにして、具体的にソースコードを編集しようとしていたらドキュメントフォーマットが効かない事に気が付きました。拡張機能のメッセージを見てね!とVSCodeから言われたのですが、まずそのメッセージは何処ぞ?と探す作業から。いろいろ探した結果、出力を表示させ、右上のドロップダウンリストから「C/C++」を選べばいいみたいです。

 

f:id:nitteru:20190122161021p:plain

C/C++拡張のメッセージ

この時点ではErrorレベルのメッセージしか出ませんので、設定の検索欄で「debug」と入力して「C/C++」を選んでからLogging LevelをDebugに変更しました。これで細かい情報が流れてくるようになりました。

 

この状態でソースコードを開き、ドキュメントのフォーマットを行うと「Failed to spawn process. Error: 267」やら「Unable to start child process !」と言ったエラーが散見されます。前者のエラー番号はGoogle先生にお伺いを立てたところ、どうもディレクトリ関係のエラーだそうです。

エラーメッセージの他の部分も眺めていると、対象となるソースコードのパスに日本語が含まれていてエンコードされておりました。エンコードされた部分が悪いのか、パスが長くなりすぎたのか不明ですが、日本語を含まないパスに変更して、再度フォーマットをかけると…成功!

あとはLogging Levelをもとに戻して無事に作業に戻ることができました。

 

今頃になって日本語にやられるとは思いませんでしたし、真の原因は不明ですがとりあえず動き出したので良しとします。昔とは根本的な原因は違うと思いますが、今頃日本語に悩まされるとは。

 

いずれまたやらかしそうなので、メモとして残します。

はじめての でんけんさんしゅ

もうそろそろ受けてみようか、と思いつつ数年経ってしまいましたが今年ようやく受験まで至りました。

 

とは言うものの、受験を決意したのが申し込み期限ギリギリ。それから今日まで個人的なことで忙しく、ほぼ準備期間が取れない状況でした。

 

そして結果は惨敗。短い準備期間でやったところすら怪しい体たらく。

 

早くも来年に向けて勉強は継続します。今までは沢山の問題が載っている参考書を使っていましたが、もう少し教科書的な物の方が基本を抑えられるので良さそうです。特に理論。ちょうど大学時代の教科書も残ってますし。

 

法規、機械は一部理論と繋がってる様子なので合わせて挑む感じでしょうか。法規は電工二種の教材も役に立ちそうです。

 

自分の分野が弱電なので、強電の範囲になる電力は知識も少なく苦手な傾向にありました。ここはちょっと課題かもしれません。

 

思えばあと5年早く挑んでおけばよかったという後悔もありますが、仕方がないので次までの一年、頑張りたいと思います。

スマートコンセントのPSE対応

スマートコンセントの様な遠隔操作でのON/OFFってPSE的にどうだったかなと思ったら、条件付きで大丈夫って事になってました…。情報の更新が遅れてますね。

IoT界隈でもスマートホームの自作やハックが流行っていますし、古いネタもありますが更新ついでに知っていることと併せて整理してみたいと思います。

 

 今回見て気になったのはTP-Linkの製品「HS105」です。これまでもこの手の製品は販売されていましたが、スマートスピーカーが出始めてから加速した感があります。

 

www.tp-link.com

 

元々遠隔操作で電気製品の電源入り切りができるのは色々条件があって、屋内使用、使用できる通信方法や負荷の上限、認められた器具であることなどが規定されています。基本は人が動作状況を確認できることが前提で制限がかかっています。事故った時に止められる、これが大事。

 

遠隔操作で話題になったのはパナソニックのエアコンでしたね。当初、PSEが時代遅れだとか経済産業省の腰が重いなど色々ありましたが、わりとその通りだと思います。ですが、PSEも最低限の品質を担保と言う、それなりの根拠というか意義はあると考えています。ここで言う品質とは、感電・火災など事故を起こさないということです(もちろん他の機器に妨害を加えないとか物理的な強度などその他諸々ありますが)。

 

それが担保できないなんてあり得ないだろと思いますが、実際に規格を満足せず開発中の試作品で火を吹く事もありますし、市場で事故を起こしたり経済産業省の試買テストで引っかかり晒され行政処分があったりします。管轄の経済産業局からの立入検査(抜き打ち)なんてものもあります。電気製品の事故も怖いし、経済産業省も怖い。

 

試買テスト・流通後規制 - 電気用品安全法(METI/経済産業省)

 

もちろんPSEを守れば安泰と言う訳ではなく、ISOやUL、JISなどの国際(国内)規格、業界規格、社内独自規格などたくさんの規格が存在します。規格の目的はそれぞれ違ったりしますが…。

 

話が逸れましたが、エアコンや国外情勢の件もあり業界から要望を受け、適用できる器具の範囲や遠隔操作の方法なども徐々に拡大されてきました。負荷が想定できない物については使う側でリスクを考えろ、ともありますが、これによりスマートコンセントが世に出回る事ができるようになったようです。

 

トピックス - 電気用品安全法(METI/経済産業省) 

電気用品調査委員会|活動成果 (該当PDF)

 

なぜ遠隔操作が制限されていたか。制限がどう緩和されたのかの詳細はJETの資料がわかりやすいかもしれません。

  

ちなみに。PSEは色々と穴みたいな物がありまして、遠隔操作機能は製品の一部だとアウトですが別製品であればセーフ、みたいな事がありました。この隙を使って間に挟む赤外線を送受信する機器も流行りました。またACアダプタで動くものはACアダプタがPSE該当で本体は非該当だったりします。PSEを取りにくい場合ACアダプタ駆動にする、なんて事もあるようです。

 

 

冒頭にも書きましたが、マイコンモジュールなどを使って商用電源に繋ぐものを作ったり電化製品をハックしたりするのに凄く敷居が下がっています。PSEがあるように商用電源での事故は本当に洒落になりません。

 

ブレーカーがあるから大丈夫だろとも思いがちですが、物によっては定格電流の500~600%が流れても遮断までに1秒かかるなんてのも普通にあります。これは電線を加熱して被覆を発火させるのに充分です。完全に短絡してブレーカーが落ちればまだいいのですが、半端な短絡でスパークしている状態だと中々遮断されません。燃えている火に油を注いでいるようなものです。慌てて消化しようとして触ってしまい感電もありえます。

 

コンセントのパーツを買ってきて配電する場合も知識、技能不足で事故る可能性が高いです。そもそも資格無しでは工事できない場合もありますし、最近ではコンセントを修理した記事が悪い意味で話題になったりしました。

 

togetter.com

 

商用電源を利用するプロダクトを作る場合、PSE周辺の情報を集めたり電工二種の資格を取ることで安全を確保しやすくなると思います。作れる物も広がるかもしれません。第一、事故ったら元も子もありませんからね。

お悔やみ

今までの人生で影響を与えてくれた人は?という質問をされた時に、一、二位を争い真っ先に頭に浮かぶ方がお亡くなりになりました。

 

約30年の付き合いの中でお互いの関係性も増えていきました。先生であって、お爺ちゃんであって、年の離れた友人でした。

 

好奇心旺盛で、年齢関係なく色んなことをやってみて、最後の最後はやり残したこと一杯、未練たらたらで旅立っていきました。すごく故人らしいと感心すらしています。

 

恩返ししたい時に親はいない(実際、親どころか血縁すらありませんが)とは言いますが、数え切れないぐらい受けた恩は故人の旅立ちだけではなく、身の回りの方々や次の世代にも還元したいと思います。

 

願わくば、故人のように人に良い影響を与えられる事ができますように。

ARMマイコンの開発環境を考える

これまでARM、特にCortex-M0、M0+のマイコンについて触る機会がありました。しかし、CMSISやBSP (Board Support Package)などのライブラリ周りも理解しておらず、IDEの言うがままに作ってきた感が否めません(BSPで提供されている関数群しか使っていない場合すらあります)。

 

そこで、ARM周辺がどうなっているのか調べてみようと思いました。その一環で開発環境の乗り換えを検討してみたいと思います。今まで使っていたCoIDEにバグや使い勝手の悪い部分があり気になっていた、というのもあります。

 

開発環境の種類は多少古くなっているものもありますがQiitaにまとめて下さった方がいらっしゃいました。

 

qiita.com

 

私が触った事があるのはmbedとCoIDE + GNU ARM Embedded Toolchainです。先にも書いたとおりメインはCoIDEです。 それぞれ触ったイメージをちょっと書き並べますと…

 

mbedはブラウザ上で開発ができ、ライブラリ周辺が充実しているため簡単に開発ができます。欠点としてはデバッグ機能ですね。とは言え、手軽で使っている人も多いので情報もたくさんあり、情報に困ることはあまりなさそうです。

 

CoIDEは中国で開発されているIDEでCMSISやBSPのインポートが比較的簡単にできます。マイコンによってはメーカー純正のデバッガ(プログラマ)が使えたりします、nuvotonのNu-Link Proとか。v1.7系とv2系がありますが安定重視ならv1.7系な気がします。かといってv1.7系が万全かというとそうでもなく、特にnuvoton製のマイコンを扱う場合で確認している事項ですがProgramming Algorithmで指定しているファイルパス初期値が誤っているために書き込み、デバッグができなかったり全体的に作り込みは甘いと思います。インポートできるCMSISもv3系をよく見かけるのですが、全体的に古いような気がします(現時点で最新版はv5系)。CMSISのバージョンって新しければ良いってのもでもないんでしょうが…。

(2017/11/24追記) このCMSISのバージョンを勘違いしておりました。"CMSISの規格全体がv5になった"と言うのが正しく、個々のヘッダファイルなどはCMSISのバージョンとは連動しないようです。そりゃそうか…。もうちょっと調べないとこの辺よく分かりません。

 

GNU ARM Embedded Toolchainはv5系までLaunchpadで配布されていました。v6系からはARMで配布されているようです。これに1年近く気がついていませんでした…。

 

このCoIDEについて乗り換え先にどういったものがあるのか調べてみました。

IDE

有償 (機能制限がありつつも使えそうなもの)

有償版は基本的にコードサイズ制限や期間限定など制限がかかった無償評価版が存在します。制限についてはIDEそれぞれなので各自確認が必要です。DS-5にはCommunity Editionが存在しますが、対応しているプロセッサがARMv8-AとCortex-A9の一部モデルに限定されます。Atmel StudioはAVR、Atmel ARMの開発に使うことができ、無償配布されています。

 無償

相変わらずCoIDEを使う選択肢もあります。Eclipseプラグイン、OpenOCDなどによるデバッガの使用が多いようです。EmacsVimVisual Studio Codeなどのエディタもあります。こちらもToolchainやデバッガとの連携で対応します。

Toolchain/コンパイラ

 デバッガ

 

EclipseGNU MCU Eclipseを使う場合、CMSISはマイコンメーカーが配布しているものを使用するのがいいのでしょうか。EclipseのPackageシステムでKeil/ARM packsを参照、インストールできるようです。これの使い方については未だイマイチ理解できていません。環境は作ってあるので試してみるしかなさそうです。

 

gnu-mcu-eclipse.github.io

 

 これから

とりあえずARMの開発環境にはどのような物があるのかを調べました。開発ができる環境を作るにあたって、無償版のEclipseを使う方法。そしてKeilやIARの無償版を使う方法の2つの軸で進めたいと思います。それぞれ、どこまでできるのかを見極めたいです。また、CMSISの概要についても調べたものをまとめたいと思います。

Visual Studio CodeでRubyの開発環境を整えてみようとして失敗した話

ちょっとしたデータの加工に使ってたRuby。最近あまり触っていないので開発環境をまともにしようと色々触ってみました。

 

IDE代わりに使うのはVisual Studio Codeです。理由は今一番使っているエディタだから。EmacsでもVimでもATOMでもありません。そもそも今頃はRubyではなくPythonかその辺りからして流行りに乗っていない感があります。

 

あちこち参考にさせて頂いて設定したのはいいものの、ブレークポイントまでは成功、AutoComplete (入力補完)については失敗という半端な結果に終わっています。

環境

用意するもの

 参考にしたところ

あちこち参考にさせていただきました。Rubyのバージョンが多少古かったりしますが、その辺はそのままでよかったり試行錯誤が必要だったりです。リンク先は記事の最後にまとめました。

 手順

RubyとDevelopment Kitをインストールする

2.4からDevelopment Kitが別配布ではなく本体のインストーラからインストールするように変更になったようです。これまでデバッグ用のGemは別途Development Kitを展開するなど作業が必要でした。

Ruby本体をインストールします。インストール後、デフォルトで"dk.rb install"が実行されるようになっています。コマンドプロンプトが開くので、msysのインストール[1]、アップデート[2]、Development Kitのインストール[3]の順で実行します。msysが既にインストール済みだとエラーが起きる事があるのでアップデート、もしくは一度アンインストールした方がよいそうです。

Gemをインストールする

デバッグに必要なGemをインストールします。はじめに適当なコマンドプロンプトもしくはPowerShellを開き、"gem install bundler"にてbundlerをインストールします。その後、Rubyソースコードを保存するフォルダにて"bundle init"コマンドでGemfileを作成します。ここにインストールするGemを追記します。下記の4つを記入しました。1,2は必須。3はAutoCompleteを実行するため。4は3をインストールすると同時にインストールを推奨されますが必須ではないようです。

gem "ruby-debug-ide"
gem "debase"
gem "rcodetools"
gem "fastri"

VScodeプラグインをインストールする

ダウンロードしたVScodeインストーラを実行、インストールします。VScode本体のインストールが終わったらプラグインをインストールします。VScode拡張機能からMarketplaceでRubyを検索し、Microsoft製の物をインストールします。ショートカットやコマンドパレットの方が早い方はそちらから。

VScode拡張機能の設定

VScodeの左にあるアイコンから虫の形をしたアイコンでデバッグ画面を表示します。左上に歯車のアイコンで設定ファイルを呼び出します。初回はターゲットとなる言語を選択する画面が出てくるようです。今回はRubyを選択し、launch.jsonが表示されます。

"Debug Local File"の欄でターゲットになるソースファイル名(メインのソース)を指定します。デフォルトはmain.rbです。useBundlerオプションの指定をしているサイトもありましたが、ruby-debug-ideをbundler経由で実行するオプションです。これはパス指定でインストールしている場合のみtrue設定のようで、私の環境ではtrueに設定するとエラーで動きませんでした。

また、VScodeの個人設定でrct-completeの場所を指定します。これはGemをインストールした時に追加されます。BATファイルを指定し、引数に"--dev"オプションが必要なようです。

"ruby.rctComplete.commandPath": "D:\\Ruby24-x64\\bin\\rct-complete.bat --dev"

デバッグしてみた結果

これで一通りの設定が終わりました。main.rbを作成し適当なソースを記述、ブレークポイントが有効に働くことが確認できます。putsなど出力結果はVScode下部のデバッグコンソールに表示されます。

AutoCompleteですが、メソッドなどを入力中にCtrl + Spaceで候補が表示されるようです。ようです、と言うのが私の環境では「候補はありません。」と表示され補完されませんでした。参考にさせて頂いたサイトによるとxmpfilter.rbというファイルとrct-completeに問題があり正しく動作しないのが原因のようです。なんてこったい。現状、AutoCompleteを使うにはEclipseなどに頼ったほうがよさそうです。

 

参考にさせて頂いたサイトさま

qiita.com

qiita.com

qiita.com

tokyo.supersoftware.co.jpqiita.com

github.com