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 と書かれたライセンスに従えば良いので、特に何も気にする必要はなさそうだ。 ソースコードを配布する場合は、上記ソースコード先頭などに書かれているの著作権表記等の部分をそのまま消さずに表示しなくてはならない点に注意すべきだろう。

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

続きを読む

IEではhtmlのid属性がwindowのプロパティになる

JavaScriptでは、varによる変数宣言をしていない場合、グローバルオブジェクト(window)のプロパティとして扱われる。
IEでは、htmlのid属性が、このグローバルオブジェクトのプロパティになってしまうらしい。

以下のコードで、「click!」というアラートが出たら、 window.btn01 に button の DomElement が入っているということになる。(Firefox や Chrome 等では、エラーになってなにも表示されないはず)

<button id="btn01" onclick="alert(btn01.innerHTML);">click!</button>

しかも jQuery が有効な状態で、

btn01 = null;

などとやろうとすると、btn01 変数にはすでに button の DOM が入っているのと、IE8とjQueryの相性の問題で、IEではエラーになってしまう。

まぁ、

var btn01 = null;

と、var つけてやるだけでOKだし、そもそもIE9ではエラーにならないので、古いブラウザ使うなってコトでFAでもよい気がしないでもないけどね…
とはいえ、9/1現在、IE8がシェア35%と圧倒的なので無視できないのよねぇ
参考: 日本のバージョン別ブラウザシェアグラフ (StatCounter Global Statsより)

WordPress Theme Designer のテーマのバグ

今現在のこのブログは、Techy boxのフリー版を少し改造して使っている。
(…と言っても、サイドバーを左に移動しているだけだが)

トップページ

何が気に入ったかって、ページの頭にFeaturedが画像付きでどんどんスライドしていくところ。
…ところが、なんか1週目のループの調子がおかしい。
どうもバグがあるようだ。

続きを読む