VPN に繋ぐと WSL2 や Hyper-V VM でネットワークに繋がらなくなる問題を解消する

OpenVPN や Cisco AnyConnect といった VPN に接続した際、 Hyper-V 仮想マシン内からや、 WSL2 のディストリビューション内、 WSL2 ベースの Docker コンテナ内から、 PC 外のネットワークにアクセスしようとすると、 以下のようなエラーが発生して失敗する。

$ # curl 利用時の例
curl: (6) Could not resolve host: example.com
curl: (5) Could not resolve proxy: proxy.example.com

$ # apt で更新しようとした場合の例
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/InRelease  Temporary failure resolving 'proxy.example.com'

エラーの内容からわかるとおり、アクセス先やプロキシーのドメイン名を DNS で解決できなくなっている。

このような問題が発生することは以前から知っていたのだが、このご時世で VPN 使うことが増えてきて、いい加減鬱陶しくなってきたので、なんとかしようと思う。

解決方法

とりあえず、まずは解決方法から。

続きを読む

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 感を感じるのが難しくなってしまっているな……

続きを読む

LINEマイカード をワンタップで起動するショートカットを作る裏技 【非公式】

LINE のサービスのひとつに、「LINEマイカード」というものがある。
いくつかの種類のポイントカードをスマホにまとめる機能だ。

ポイントカードで財布がパンパンになりがちな私には、なかなかもってこいなサービスだ。
# 正直、2018年10月にロンチしてからこの数ヶ月間、カードの種類が大して増えないので、今後も使える将来性のあるサービスなのか正直怪しいのだが…

しかし、この LINEマイカード、実際使い始めてみると、ある致命的な問題に遭遇する。
LINEマイカード の起動するまでが遠い のだ。

例えば、適当な画面から LINEマイカード を開こうとすると、

  1. ホーム画面に移動する
  2. LINE を起動する(おそらくトーク画面だろう)
  3. トップページに移動する
  4. ウォレットタブに移動する
  5. マイカードアイコンを選ぶ
  6. 使いたいポイントカードを

という、 6動作も必要となる。 ((1)はいらんやろという異論はあるだろうが)

レジでの会計時にパッと使いたいのに、こんなにももたつく操作では大変使いづらい。

LINE Pay や LINE Out などであれば、 LINE アプリ内からホーム画面にショートカットを作ることができる。
しかし、 LINEマイカードについてはそのような機能はない。 (2019年3月現在)

ということで、別の方法で Android のホーム画面からワンタップで LINEマイカードに起動する方法を考えてみよう。

詳細な手順は異なるが、 考え方自体は同じなので iPhone でも実現できるはずだ。

続きを読む

Twenty Eleven Theme Extensions が SSL化 でエラー

当ブログでは、 WordPress の Twenty Eleven テーマを使っている。

このテーマでば、なぜかシングルページの表示や個別記事のページでサイドバーが表示されない。

当ブログのアクセスのほとんどは、 検索からの個別記事のページへの流入なので、個別記事へのサイドバーの表示は行っておきたいところだ。

それを実現するのが、 Twenty Eleven Theme Extensions プラグインだ。

とても古いプラグインだが、 Twenty Eleven テーマの最新版でも問題なく動いている。

ところが、 このプラグインを有効にしたところ、 Google の Search Console で怒られるようになってしまった。

調べてみたところ、 /plugins/twenty-eleven-theme-extensions/moztheme2011.css の配信が This request has been blocked; the content must be served over HTTPS. でエラーになってしまっているようだ。
このブログは SSL化 され https:// で配信されているのに、プラグインの CSS が http:// で配信されているためだ。

これを修正してみよう。

続きを読む

Pydroid で オフライン&セルフホスト の Web アプリを動かす

運用時にネットワークにつながっていない Android タブレットで、 自作のアプリケーションを 簡単に 動かすには、どうしたらよいだろうか?

.apk ビルドしてインストールさせる?いやいや、手軽からはほど遠いだろう。

現在のトレンドは PWA で Service Worker を組み合わせてキャッシュさせる方法だろうか。
PWA 配信するには https のホスティングを用意しなくてはならないし、ブラウザのキャッシュ整理したらデータが吹き飛んでしまう。

ここで私は、 Android 上で Python を動かしてセルフホストさせる方法 を提唱したい。

続きを読む

Flask + jinja でレイアウトの指定 (extends タグ) のテンプレートを ソースコード文字列 で指定する

Python の軽量な Webアプリケーション フレームワーク として有名な Flask。
この Flask を使うと たった一ひとつのソースファイルで簡単に Webアプリケーション を作成できる。

Flask では Jinja2 というテンプレートエンジンを採用している。
通常はテンプレートソースを .html ファイルにテンプレートソースを書き出して ファイル名を指定してそのテンプレートを読み出すのだが、 flask.render_template_string を使えば Python ソースコード上で定義した テンプレート文字列 を使うことができる。

しかし、 extends ステートメントや include ステートメントを使ってレイアウト用などのテンプレートを呼び出す際に、 そのテンプレートを ファイル名 で指定する方法の情報しか出てこない。
これでは、 ひとつのソースファイルで記述できない。
テンプレートソース文字列 を使ってテンプレートの継承を行う方法を、メモがてらまとめておく。

以下のサンプルは Flask を使ったものだが、 Django で Jinja2 を使用した場合も同じように対応できると思われる。


サンプル実装

extends タグinclude ステートメント では、 与えられた文字列のテンプレートファイルをテンプレートローダーが探し出して、 テンプレートの継承関係を解決する仕組みになっている。
Jinja のドキュメントには書かれていないが、 文字列ではなく Jinja の Template オブジェクト を与えると、そのテンプレートをそのまま使ってくれるようだ。

つまり、 あらかじめ Template オブジェクトを作成しておいて、 それを jinja_env.globalsrender_template_string のキーワード引数によってテンプレート内の引数に渡し、 最終的に extends タグに渡るようにすればよいのだ。

サンプルコードは以下の通り。

続きを読む

System.Data.SQLite の NuGet パッケージ のうち どれをインストールするべきか

この記事は、(この記事が初公開された日を基準にして) 4年前に投稿された

の記事のフォロー記事だ。

Visual Studio 2012 に標準で含まれて以降、 NuGet を使ってライブラリパッケージをインストールすることが標準的になった。
しかし、 System.Data.SQLite に於いては、 NuGet パッケージの方も相変わらず多くのパッケージが公開されているので、 これらについてもどれをインストールすべきか解説してみようと思う。 160620_1

Entity Framework Core について書いたひとつ前の記事の

とは異なり、 こちらの記事は Full .NET で SQLite を使う場合で、 特に Entity Framework 6.x と組み合わせる際に有用な内容となっている。
(残念ながら、 System.Data.SQLite は .NET Core では使えないのだ。)

公開されている NuGet パッケージ

続きを読む

PDF のページを好きなサイズの png 画像に変換する たった1つのステップ

document.location = document.getElementById('page1').toDataURL();

Firefox で PDF 開いて任意のサイズで表示し、 開発者コンソール (F12キー) で上記のコード実行すれば、png 画像になって表示される。
あとはその画像を「名前をつけて保存」すればいい。

続きを読む

System.Data.SQLite でどれをインストールするべきか

ちょっとした宣伝:

NuGet パッケージマネージャを使う場合については、別途

の記事にまとめている。

以下、本題。

メモ: 内容が 2012 年当時のものなので、 引用元の文章がすでになくなっていたりするが、 内容的には問題ないはずだ。

System.Data.SQLite を導入する

SQLite の ADO.NET アダプタである、System.Data.SQLite。
単なるラッパではなく、SQLite 自体もパッケージに持っているので、別途 SQLite をパッケージに含めなくても良いのが利点。
しかも、ライセンスが Public Domain であるのが、非常に使い勝手が良い。

注意: 詳しくは System.Data.SQLite の 著作権表記 を読んでほしいが、"System.Data.SQLite.Linq" と "System.Data.SQLite.EF6" については、ソースコードの一部が Ms-PL ライセンスとなっている。
Ms-PL ライセンスとなっている SQL Generation ディレクトリ のソースは、public domain と明示されているものをのぞくと、すべて copyright (c) Microsoft Corporation と書いてある。 ビルド済みバイナリには Microsoft の著作権表記などが出てこないため、バイナリ配布であれば Public Domain と書かれたライセンスに従えば良いので、特に何も気にする必要はなさそうだ。 ソースコードを配布する場合は、上記ソースコード先頭などに書かれているの著作権表記等の部分をそのまま消さずに表示しなくてはならない点に注意すべきだろう。

さて、いざ使おうとダウンロードページに飛ぶと、それはもうすごい数のパッケージが配布されている。

続きを読む