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 タグに渡るようにすればよいのだ。

サンプルコードは以下の通り。
続きを読む

Selenium でページ全体のスクリーンショットを撮る (Python)

02/25 更新: Chrome で水平スクロールバーがスクリーンショットに写ってしまう問題を修正。

Selenium を使って自動テストを行っていると、表示された結果のスクリーンショットを撮って保存したい時がままある。

ところが、 Chrome や Firefox で Selenium のスクリーンショット機能を使うと、 ウィンドウに表示されている内容だけしか取得できない。
(ブラウザやそのバージョンによって動作が異なる)


この記事によると、これは Selenium の仕様らしい。

ブラウザごとの挙動の差はさておき、 ウィンドウサイズでの取得となってしまう Chrome と Firefox で、何とかページ全体のスクリーンショットを保存したい。
ここでは、 Selenium の Python Binding を使って、実現する方法を考えてみる。

続きを読む

ideapad Miix720 Core i7 16GB ~2018年のベストバイ~

01/15 追記: 価格.com のページは残っているが Lenovo の直販ページへのリンクが切れていて、どうも Lenovo 直販モデルの扱いがなくなってしまっているようだ…
販売代理店モデルはまだあるようなのだが、そちらはメインメモリサイズが 8GB にとどまってしまっている。
CES 2019 で後継モデルが発表されたのかと思いきや、そんなことは全くなく、リーズナブルな Surface ライクのサイズ&性能のモデルがなくなってしまったのが残念でならない…

唐突だが、 2018 年のベストバイだった Lenovo の 2-in-1 タブレット, Miix 720 の Core i7 16GB モデル をレビューしたいと思う。
(2018年中の記事0は悲しいからね)

のっけから話の腰骨を折るが、 このモデルの発売日は 2017年 の夏ごろで、 2018年 に発売されたものではない。
にもかかわらず挙げているのは、 2019年も迫る現在でもこの端末に相当する良機が見つからないからだ。


購入経緯

まず、私はこれまで Surface Pro 2 (Core i5, 256GB SSD, 8GB Memory) を使っていた。
2013年当時は、 ペン同梱の本体と Type Cover をセットにしても14万円くらい購入ができた。
かれこれもうまる5年使っているので、 バッテリーがヘタヘタだし、 少しの衝撃で勝手に再起動されるようになってしまったので、 これの代替になるマシンが欲しかったのだ。

そこで、 2018年 にこれから数年使うために求めたのが以下の通り。

  • 筆圧対応ペン付きタッチパネル搭載 ラップトップ または 2-in-1
  • メモリは 人権 最低 8GB, できれば 16GB
  • ストレージは 256GB 以上
  • モニターは WUXGA 以上
  • SD または micro SD カードスロット

これを、 Surface Pro 5 や 6 で揃えようとすると、
8GB メモリですら 16万円、 16GB メモリにこだわると 27万円 などというとても手が出さない値段になってしまう。

ところが、この Miix720 であれば実質 12万円 ですべてがそろってしまうのだ。


Surface Pro 2 と比べると、ふた回りでかいが、携帯性は高いので全然問題ない。


主な仕様と特徴

主な仕様は以下の通り。

続きを読む

pipenv の仮想環境のフォルダ名のルール

Python におけるパッケージ管理と言えば、 以前は virtualenv/venv で仮想環境を作成し、 pip を使って その仮想環境にパッケージをインストールするのが、おなじみの方法だった。

node.js の npm や .NET の dotnet restore などに慣れている人々にとっては、 環境の管理やパッケージの管理が別々だったり、 ひとつのファイル+ひとつのコマンド で環境を復元できないのは、 ソースコード管理がスマートにできず、非常に面倒に感じる。

このため、 Python にも 仮想環境・パッケージ管理を統合するツールがいくつも生まれては消えていった。
そして、最近になってついに、 Python.org 公式が推奨する Python パッケージ管理ツールとして、 pipenv というものが登場したようだ。 (→ Python.org)

pipenv の仮想環境の場所

pipenv install コマンドを使ってパッケージをインストールすると、 npm の package.json にあたる Pipfile というファイルがカレントディレクトリにできあがるが、 npm の node_modules にあたるようなパッケージがインストールされた仮想環境のフォルダは、カレントディレクトリは(標準の設定だと)作成されない。 1

その仮想環境のフォルダの場所は pipenv --venv コマンドで調べることができる。
Windows の場合は、 %USERPROFILE%/.virtualenvs/ に、環境毎のサブディレクトリが作成されているはずだ。

その仮想環境ディレクトリの名前の前半は、 Pipfile が存在するフォルダの名前になるが、 最後の9文字はなにやらランダムのような名前がつけられている。
例えば、 D:/pipenv/ で pipenv を初期化した場合、 %USERPROFILE%/.virtualenvs/pipenv-LAdtM08T/ が作成されるだろう。

はたして、この文字は何なのか?

続きを読む

Pandoc の Portable Windows バージョンを作る

Pandoc は、 HTML や、 Markdown, Textile, LaTeX などはじめとした、豊富な各種マークアップ形式を、別の形式に変換できるコマンドラインツールだ。

例えば、 textile → markdown 変換 とか、 HTML → markdown 逆変換 といったようなことができる。

何ができるかは、 Pandoc ユーザーズガイド あたりを参照してほしい。

さて、 この Pandoc の Windows 版は msi のインストーラ形式でしか配布されていない。

このインストーラでインストールすると、 ユーザディレクトリの %LOCALAPPDATA%\Pandoc\ (もしくは %ProgramFiles(x86)%\Pandoc\) に実行ファイルを展開して、 PATH を通してくる。
どうやら、システムディレクトリにファイルを置いたりしないようなので、 正直これだけのためにインストーラを実行して、 PATH や レジストリを汚すようなことをしたくない。

ということで、 msi インストーラから、 インストールをせずに実行ファイルだけ取り出して、 Portable 版を作成してみよう。

続きを読む

ZoneId を PowerShell を使って一括削除 [v3 以上]

Windows では、リモートからダウンロードしたファイルに、 “ZoneId” という物が付加される。
このID が付加されたファイルは、 exe として 実行する際にセキュリティ警告が表示されたり、 .NET アセンブリ dll として PowerShell に読み込む際に、

Add-Type : ファイルまたはアセンブリ 'file:///*.dll'、またはその依存関係の 1 つが読み込めませんでした。操作はサポートされません。 (HRESULT からの例外: 0x80131515)
発生場所 行:1 文字:1
+ Add-Type -Path 'C:\*.dll'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Add-Type], FileLoadException
    + FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand

などとエラーになってしまう。
160925_1

ファイルが一つだけなのであれば、ファイルのプロパティから『ブロックの解除』をチェックすれば、簡単に ZoneId を削除することができる。
160925_2
しかし、複数個のファイルの ZoneId を一回の操作で同じように削除することができないため、 ZoneId を削除したいファイルが大量にある場合はなかなかウザい。

PowerShell v3 以上を使えば、この ZoneId 削除をいとも簡単に行うことができるので、紹介しよう。

続きを読む

PowerShell バージョンごとのスクリプティング機能の新機能概略

PowerShell v3 以降のそれぞれのバージョン毎のスクリプティングを中心とした新機能のうち、私の独断で選んだ主な機能を列挙してみた。
(PowerShell の本来の役割のはずの) コンピュータ管理機能などはばっさり省いている。

意外と、そういう情報まとまっているのを見たことなかったので。。。

続きを読む

Python の類似画像ライブラリ ImageHash を Windows で使う

sha1 や md5 等で知られるファイルハッシュは、ファイルの1ビットでも異なると、全く別のダイジェスト値を返すように作られている。

一方で、 画像の情報をハッシュ化する際に、 画像の大きさや微妙な違いには目を瞑って同じような画像は同じダイジェスト値、似たような画像は似たようなダイジェスト値を得たい場合もある。
例えば、大きさの違う画像や、 jpeg, png の形式が異なる画像を 同じ画像として扱うようにしたい場合だ。

そのようなハッシュ関数はいくつか知られている。

  • average hashing (aHash)
  • perception hashing (pHash)
  • difference hashing (dHash)
  • wavelet hashing (wHash)

そのうち、上記の 4つ の計算を行えるのが、 Python の ImageHash ライブラリだ。

このライブラリ自体は ピュアな Python ライブラリなのだが、 依存しているパッケージが総じて C言語拡張モジュールなので Windows で動作させるにはすこし手間がかかる。

そこで、 cygwin 上の python にインストールする場合と、 Windows 上の CPython にインストールする方法をそれぞれ紹介しよう。

以下は virtualenv を使って仮想環境上にインストールする手順とするが、 直接 Python のシステム環境に入れてしまっても問題はない。

メモ: 2017年現在、 pypi でプリコンパイル済みの依存モジュールがダウンロードできるので、以下の方法を使わなくても pippipenv コマンドだけでインストールが完了するはずだ。

cygwin を使う場合

続きを読む