« 2020年2月 | トップページ | 2020年4月 »

2020年3月

2020/03/28

Chrome DevToolsで出ていたViolationおばけ

JavaScriptを含むページを書いている時にChrome DevToolsを使っていると、[Violation]が2つ続けて出て気持ち悪いなと思っていました。
具体的には、次のようなメッセージです:

[Violation] Added synchronous DOM mutation listener to a 'DOMSubtreeModified' event. Consider using MutationObserver to make the page more responsive. jquery.min.js:14

add @ jquery.min.js:14
(anonymous) @ jquery.min.js:14
each @ jquery.min.js:14
each @ jquery.min.js:14
on @ jquery.min.js:14
bind @ jquery.min.js:14
init @ content.js:119
(anonymous) @ content.js:132

200328violation

jQueryは使ってないのになぁ、と思いつつデバッグしたのですがそれらしいコードは見つからない。
JavaScriptのブロックを全て/* 〜 */で括っても出る(!)。JavaScriptの無いページを作っても出る… まさかChromeのバグ? と思いながら検索したところ、次のページが見つかりました:

キャッシュを無効にしてページ表示速度を計測する方法

それで試しにシークレットウィンドウを開いて動かしてみると、[Violation]が出ない。
どうやら原因は拡張機能(アドオン)のようです。
確認の結果、[Violation]を出していたのはGoogle謹製で最近放置されているDocs PDF/PowerPoint Viewer(by Google)3.10でした。
200328docsviewr

PDFChrome
設定>プライバシーとセキュリティ>サイトの設定>PDFドキュメント
の「PDFファイルをChromeで自動的に開く」側で開けないバグが最近取れたので、拡張機能は使わなくて良くなりましたし、個人的にOfficeファイルを扱うことはほとんど無いので、この拡張機能はOFFにしておくことにしました。(いまあらためてレビューを見ると散々ですね…)

というわけで、[Violation]は文字通りおばけでした。今後また出たときはきっと本物だと思うので気をつけます。

 

パドラッパ from MacBook Air (2017)

 

| | | コメント (0)

2020/03/25

TinkerBoardのApache2 HTTPS対応メモ(2020/03/26追記)

うちの中で使っているWEBサーバーを使うと「保護されていない通信」とChromeで表示されるのが気持ち悪く、HTTPS対応することを思い立ちました。

200324_tb01ssl1

なんとかできたのですが、ちょっと苦労したので、ほぼ自分向けの備忘録を残しておきます。

200324_tb01ssl2

typoや状況の変化などありましたらご指摘頂けると助かります。

私が使っているローカルWEBサーバーはASUSのTinkerBoardで、バージョン等は次の通りです:
200325_version

このWEBサーバーのIPアドレスは 192.168.0.2, /etc/hostsで付けている自称はtb01です。

また、クライアント側のWEBブラウザが証明書を自動的にインポートするのは、証明書の認証局が信頼できるリストに入っている場合だけです。ここで作る認証局は当然リストに入っていませんので、ハンドでインポートする必要があります(面白くないけど仕方ない)。

私はmacOS (Catalina 10.15.3)とAQUOS sense plus SH-M07 (Android 9)でインポートし、Google Chrome 80.0.3987.149で動作確認しました。macOSのSafari 13.1でも動作確認しました。
(2020/03/26追記:Windows10のChrome 80.0.3987.149, IE 11.719.18362.2, Edge 44.18362.449.0およびiOS 12.4.6の第6世代iPod(音楽プレイヤー、iPadにあらず)のSafari 12.1.2, Chrome 80.0.3987.95でも動作確認しました。これらはインポートする証明書が違ったので、その旨を追記済です)

主に参考にさせて頂いたページは、手順の順番に、次の6つです:
1.Ubuntu 18.04 LTS で OpenSSL を使ったプライベート認証局&証明書を作る - 未完放流 -
2.RaspberryPiでApache2をHTTPSに対応させたい! - Qiita -
3.UNIXユーザ奮戦記 : Apache2のServerName Error -
4.スマホに、IPアドレスのオレオレサーバ証明書をインストールする: パソコン鳥のブログ -
5.ルートCA(証明機関)の証明書をインポートする - Windows Tips - ←2020/03/26追加
6.iOS や iPadOS で手動でインストールした証明書プロファイルを信頼する - Apple サポート - ←2020/03/26追加

前置きが長くなりましたが、以下ほぼコマンド等を羅列します。内容は上記ブログを参照して下さい。異なる点のみ内容を書きます。

 

まずは、証明書の作成準備:

参考:上記1.

sudo mkdir /etc/apache2/ssl
cd /etc/apache2/ssl
sudo cp /etc/ssl/openssl.cnf ./original_openssl.cnf
sudo vi original_openssl.cnf
サンプル - original_openssl.cnf
sudo vi createca
サンプル - createca
sudo vi createsrv
サンプル - createsrv
sudo vi ext_v3
サンプル - ext_v3

createcaとcreatesrvは、認証局と証明書を作るシェルスクリプトです。

ext_v3のbasicConstraintsが上記1.ではCA:FALSEでしたが、それだとAndroidで有効にならないので、CA:TRUEにしました。
ここは少々気持ち悪いです。

 

続いて、サーバーの準備:

参考:上記2.上記3.

cd /etc/apache2/sites-available/
sudo cp default-ssl.conf default-ssl.conf.bak
sudo vi default-ssl.conf
サンプル - defaultssl.conf

ここでDocumentRootは私特有のところになっています。また、私はPythonを使っているのでFilesMatchにpyを加えています。

cd /etc/apache2/conf-available/
sudo vi local-servername.conf
サンプル - localservername.conf

 

いよいよ証明書の作成とサーバーの起動:

参考:上記2.

cd /etc/apache2/ssl
sudo sh createca

ここでローカル認証局を作ります。スクリプトからの問い合わせに対し(国・県・市・団体名は適当で)、organizationalUnitNameをCAに、Common Nameを127.0.0.1:443にします(IPアドレスはlocalhost、443はSSL/TLSのポート番号)。メールアドレス以下は空EnterでOKで、コミットに2回yを押します。:443を入力し忘れるなどしたらctrl+cで抜けられます。

sudo sh createsrv

ここでWEBサーバー用の証明書を作ります。こちらではorganizationalUnitNameをホスト名に、Common Nameをクライアントからアクセスするアドレスの192.168.0.2:443にします。ホスト名は/etc/hostsに合わせておけば無難でしょう。

以下、ドドッとサーバー起動です
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo a2enconf local-servername
sudo service apache2 restart
systemctl status apache2.service

これでサーバー側は完了です。

もしエラーが出ていたら、systemctl statusの出力のほか、次を確認します。

journalctl -xe
tail -20 /var/log/apache2/error.log

エラーが出たときのやり直し手順と、確認ファイルのまとめを下の方に書いておきます。

 

クライアントへの証明書インポート:

参考:上記4.上記5.上記6.

サーバーのエラーが出ていなければ、クライアントのChromeからhttps://192.168.0.2/へ(あなたのWEBサーバーのトップページへ"s"つきで)アクセスします。すると「この接続ではプライバシーが保護されません」が出ます。
これは、SSLサーバーは立ち上がっているけれど、証明書がインポートされていない、という状態です。
では、続いてクライアントへ証明書をコピーしましょう。私はサーバーでSambaも動かしているので、そちらにコピーして、クライアントから取りに行きました。(WindowsおよびiOS用を2020/03/26追記。WEB配布でもいいですね。)

cd /etc/apache2/ssl/server
sudo cp localhost.crt ~/hoge.crt
 ↑これはmacOS用。Sambaの適当なフォルダに分かりやすい名前で。拡張子は.crt
sudo cp localhost.der.crt ~/hoge.der.crt
 ↑こちらはAndroid用。Sambaの適当なフォルダに分かりやすい名前で。こちらも拡張子は.crt
cd /etc/apache2/ssl/demoCA
sudo cp ca.crt ~/fuga.crt
 ↑これはWindowsおよびiOS用。Sambaの適当なフォルダに分かりやすい名前で。拡張子は.crt
(sudoを付けたのは、前に失敗したファイルが残っているかも知れないからです… はまったので。)

インポートの手順はOSによって異なります。
macOSの場合は、Finderでhoge.crtを開くと「キーチェーンアクセス.app」が起動します。あとはAppleの公式案内通りに開き「常に信頼」します。
Androidの場合は上記4.の通りです。
WindowsとiOSの場合はサーバーの証明書ではなく、ルート証明機関の証明書を使います。上記5.の通りです。

インポートを終えて、再びhttps://192.168.0.2/へアクセスすると、鍵付きになりました!

なお、ページの内容によっては「鍵」にならず「丸囲みのi」になることがあるそうです。次のページに解説がありましたので、参考まで:
このサイトへの接続は完全には保護されていません ← 対処法を解説【混合コンテンツがあります】 -

 

おまけ:

失敗したときの手戻し手順:
cd /etc/apache2/ssl
sudo a2disconf local-servername
sudo a2dissite default-ssl
sudo a2dismod ssl
sudo service apache2 restart
systemctl status apache2.service

…SSLサーバーを落としたのでAH00558が出ます。

設定ファイルの確認まとめ:
sudo vi /etc/apache2/ssl/original_openssl.cnf
sudo vi /etc/apache2/sites-available/default-ssl.conf
sudo vi /etc/apache2/conf-available/local-servername.conf
sudo vi /etc/apache2/ssl/createca
sudo vi /etc/apache2/ssl/createsrv
sudo vi /etc/apache2/ssl/ext_v3

 

確認後の再開手順(前回の証明書は消してやり直す):
cd /etc/apache2/ssl
sudo rm -rf demoCA
sudo rm -rf server
sudo sh createca
sudo sh createsrv
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo a2enconf local-servername
sudo service apache2 restart
systemctl status apache2.service

…エラーが出ていませんように!

ご利用は自己責任で。

 

パドラッパ from MacBook Air (2017)

 

ps. 書き終えてアップした直後にmacOS 10.15.4が降ってきましたが、問題無く動いています。

 

 【2020/03/26記】
macOSとAndroidの場合はSSLサーバ証明書のインポートで通りましたが、Windows10およびiOSでは認証局側のルート証明書が必要でした。その旨を追記しました。
また、WEBサーバーの話をしているのだからWEBで配布すればいいと後で気付きました(お恥ずかしい)。

| | | コメント (0)

2020/03/16

Pythonリファクタリング初体験(2021/05/03追記)

「小説家になろう」のテキストに青空文庫形式の注記を付けて読むPythonスクリプトを作って使っていて、いつまでも「動けば正義」でいいのかなと思い、チェックするツールを使ってみました。

はじめに次のページを見ながらflake8というツールを試してみたところ、出るわ出るわ(^^;;
Vimメモ : flake8でPythonのコードをチェックする - もた日記

 

そもそも「インデントはスペース4つ」からコーディングスタイルを意識していなかった(というか、持っている教科書に載っていたPEP 8という言葉さえスルーしていた)ので、ギャップが酷かったです。
Pytutorial

インデント以外で目立っていたのが、次の2つ:
E501 line too long … 確かに、長すぎる行は気になっていた
C901 'main' is too complex (15) … そんなに複雑とは思っていなかった
あと、使わなくなったライブラリをインポートしているのが見つかった、など。

 

せっかくの機会なので、リファクタリングみたいなことをしてみることにしました。
長い行を改行するにも細かいルールがあって、その辺はautopep8が教えてくれそうです
autopep8 – PythonコードをPEP 8スタイルガイドに準拠するように自動的にフォーマットするツール – GitHubじゃ!Pythonじゃ!
また、循環的複雑度CCや保守性miという指標で測定してくれるradonも入れてみました
radonを使用したPythonのソースコードのメトリックスの取得 - Qiita

実際に使ってみたところ、文法的な問題をflake8が、基本的な「書き方」をautopep8が、お作法への適合度をradonが、それぞれ教えてくれる感じでした。

 

ほぼ1日チマチマと作業をしていたところ、いずれのツールでもエラー無くA評価を頂けるようになりました。
数値的には、循環的複雑度CCが18から5に大幅改善したものの、保守性miは57から53に低下して、実際、見やすくなったかというと微妙な感じです。まぁ、あくまでも書いている本人の主観なので、元々が自分に分かりやすいように書いていただけなのですけど。

 

また、前回3/12にリリースした後に、少し機能強化してました:
・追加取得(差分取得)時に、章タイトルが前と同じなら被らないようにした
・青空文庫形式の注記なしのテキストを、オプション -t で取得できるようにした

 

新版はこちらです(前のページも差し換わっています):
ダウンロード - narou2az.py

(2020/03/21差し換えました。詳細は下記)

シェルスクリプト自体は変わっていないのですが、後の方に参考文献などのメモを付けているので、こちらも差し換えておきます:
ダウンロード - nabat.sh

ちなみに前回の版と、コードチェックするシェルスクリプトと、前回と今回のチェック結果を付けておきます(今となっては、すごく恥ずかしい):

ダウンロード - narou2az_200312.py

ダウンロード - codechk.sh

ダウンロード - check200312.txt

ダウンロード - check200316.txt

 

ご利用は自己責任で。

 

パドラッパ from MacBook Air (2017)

 

【2020/03/21記】
宅内のCGIサーバーに組み込み、JavaScriptの皮を被せて、PCを起動しなくても取得できるようにしました。
N2a_cgi
このお遊びの最中に、Python側のバグが見つかったので、Pythonファイルを差し換えました。
ファイル読み込み時のUTF-8明示し忘れがあって、CGIから起動したときに叱られた次第です。

併せて、引数のNコードがおかしくても確認を求めないオプションを付けました(CGI起動だと返事できないので)。

【2021/05/03記】
今後、こちらのスクリプトは随時最新版に差し換えます。更新履歴および最新版の確認はGitHubをご覧ください(詳しくはこちら)。

| | | コメント (0)

2020/03/12

「なろう一括取得から青空文庫形式」の改良版(2021/05/03追記)

「小説家になろう」で連載がはじまった「異世界における科学捜査の手法について。~新人捜査官の出向先がいきなり異世界だなんて!!~」が、強烈なルビ(ふりがな)込みで面白いので、私のスクリプトも青空文庫形式のルビに対応しました。
ついでに(というかBeautiful Soupでパースするのが面白くなって)、第一話の前に表紙(作者・タイトル・あらすじ)を付けました。

これまで、連載更新された作品を追加取得するときに、エラーが出ることがありました。原因調査したところ、本文の分割テキストをダウンロードしたフォルダに、その分割テキスト以外のファイルがあるとエラーが出ることが分かりました。実際には、macOSの悪名高き隠しファイル.DS_Storeができていて、取得済みファイルを確認する際に型の不一致が生じていました。この現象が起こらないようにするため、次のように確認方法を改良しています。
【before】
 existing_parts = {int(re_part.search(fn).group(1)) for fn in os.listdir(novel_dir)}
【after】
 existing_parts = {int(re_part.match(fn).group(1)) for fn in os.listdir(novel_dir) if re_part.match(fn)}
つまり、名前の規則(パターン)が一致したファイルだけをチェックし、さらに、一致条件をre.searchからre.matchに厳格化しました。

また、シェルスクリプトとPythonスクリプトの機能分担を見直して、ほとんどの作業はPythonで行うようにしました。そのため、既に使っておられた方は、両方とも入れ換えて下さい。使い方は基本的に変わりません。

ダウンロード - narou2az.py

ダウンロード - nabat.sh

(今回から、Windows10のAnacondaでもPythonスクリプトのみ動作確認しています。ファイル操作が少しLinux系と違いました。)

元ページのファイルも同時に差し替わっています。)
シェルスクリプトの方は、macOSでcommand化する場合などのために、スクリプトのあるフォルダで実行するようにしています。

(2020/03/21 ファイルを差し換えました。内容は末尾の追記をご参照下さい。) 

画面のサンプルを付けておきます。
ルビは、こんな風につきます:
Csi1
表紙はこんな感じ。作者名を取得するのに少し苦労しました:
Csi2
あらすじはこんな感じ。「あらすじ」を中見出しにしています:
Csi3

 

ご利用は自己責任で。

 

パドラッパ from MacBook Air (2017)

 

【2020/03/16記】
スクリプトをリファクタリングして差し換えました。詳細はPythonリファクタリング初体験をご参照下さい。
機能的には、
・追加取得(差分取得)時に、章タイトルが前と同じなら被らないようにした
・青空文庫形式の注記なしのテキストを、オプション -t で取得できるようにした
の2点を追加しています。

【2020/03/21記】
宅内のCGIサーバーに組み込み、JavaScriptの皮を被せて、PCを起動しなくても取得できるようにしました。
このお遊びの最中に、Python側のバグが見つかったので、Pythonファイルを差し換えました。
ファイル読み込み時のUTF-8明示し忘れがあって、CGIから起動したときに叱られた次第です。

併せて、引数のNコードがおかしくても確認を求めないオプションを付けました(CGI起動だと返事できないので)。

【2021/05/03記】
今後、こちらのスクリプトは随時最新版に差し換えます。更新履歴および最新版の確認はGitHubをご覧ください(詳しくはこちら)。

| | | コメント (0)

2020/03/08

macOSでのシェルスクリプト実行方法

これまで(何も考えずに)ターミナルを開いてスクリプトのあるフォルダにcdして./hoge.shと叩いていたのですが、
拡張子を"command"に変えてhoge.commandとしておけば、
Finderでダブルクリックするだけで実行できると知りました。

なお、ユーザーのホームフォルダからのスタートになるので、スクリプト内でcdなどが必要になる場合があります。

参考:
Macでシェルスクリプトをダブルクリックで実行 - Qiita -

 

これは便利。あらためて先達に感謝。

 

パドラッパ from MacBook Air (2017)

| | | コメント (0)

2020/03/07

「小説家になろう」のテキストに、青空文庫形式の注記を付けて読む(2021/05/03追記)

「小説家になろう」の作品を一括取得して、BOOX Poke Proで読むのに、個別ファイルをZIPでまとめて読書尚友(青空文庫ビューア)を使っていたのですが、読書尚友の簡素で速い検索機能と目次機能を使いたくなって、青空文庫の注記形式のうち、見出しと改ページを入れた全文一括テキストを作れるようにしました。

テキスト取得するPythonスクリプトと、全文一括テキストにするシェルスクリプトの組合せです:

ダウンロード - narou2az.py

ダウンロード - nabat.sh

(2020/03/21 ファイルを差し換えました。内容は末尾の追記をご参照下さい。) 

開発環境は、MacBook Air (2017), macOS 10.15.3, Python 3.7.3 です。
Raspberry pi (raspbian 8.0 jessie)のPython 3.4.2と、
Windows10 WSL Ubuntu 16.04.6 (LTS)のPython 3.5.2と、
Windows10のAnaconda 2002.02 Python 3.7.6でも動作確認しています(Anacondaは2020/03/12から、Pythonスクリプトのみ)。
Python 3.4.3でhttp.clientにおける証明書の扱いが変更になっているので、簡単なバージョンチェックを入れました。)

 

使い方は、./nabat.shで起動して、作品のURLをコピペしてreturnします。
例えば「本好きの下剋上 ~司書になるためには手段を選んでいられません~」の場合、「https://ncode.syosetu.com/n4830bu/」です(大作なので12分ぐらいかかります)。

順を追っていくと、取り込みたい作品のURLをクリップボードにコピーし、
Honzuki1

./nabat.sh後の指示に従ってURLをペーストして確認メッセージに応えると、Nコードフォルダの下に全文一括テキストと、個別テキストをまとめたZIPファイルができます。
この全文一括テキストを読書尚友で読み込んで目次表示すると、こんな感じです:
Honzuki3

ここで例えば「閑話 コリンナ様のお宅訪問」を選ぶと(OVAは期待通り面白かったです)、ちゃんと表示されました。
Honzuki4

検索機能の一例です。この長編の数ある名セリフの断片から、ズバッと該当箇所が出てくるのは快感です。
Honzuki5

 

なお、Pythonスクリプトを動かす環境については「小説家になろう」の作品を一括取得して、BOOX Poke Proで読むを、
シェルスクリプトについては一括取得を簡単にするシェルスクリプトを参考にして頂けると幸いです。

 

ご利用は自己責任で。

 

パドラッパ from MacBook Air (2017)

 

【2020/03/12記】
エラー処理をはじめとして、色々と改良しました。詳しくは改良版の記事を参照して下さい。
Pythonとシェルスクリプトの機能分担を見直したので、既に使っておられた方は、両方とも入れ換えて下さい。なお、renameは使わなくなりました。

Windows10でのPythonスクリプトのテストに、Ubuntuに加えてAnacondaも使ってみました。Anacondaのバージョンは2020.02、Python 3.7.6です。コンソールが「DOS窓」なので、シェルスクリプトは動きません。必要に応じてバッチファイルを作って下さい。

 

【2020/03/16記】
スクリプトをリファクタリングして差し換えました。詳細はPythonリファクタリング初体験をご参照下さい。
機能的には、
・追加取得(差分取得)時に、章タイトルが前と同じなら被らないようにした
・青空文庫形式の注記なしのテキストを、オプション -t で取得できるようにした
の2点を追加しています。

 

【2020/03/21記】
宅内のCGIサーバーに組み込み、JavaScriptの皮を被せて、PCを起動しなくても取得できるようにしました。
このお遊びの最中に、Python側のバグが見つかったので、Pythonファイルを差し換えました。
ファイル読み込み時のUTF-8明示し忘れがあって、CGIから起動したときに叱られた次第です。

併せて、引数のNコードがおかしくても確認を求めないオプションを付けました(CGI起動だと返事できないので)。

 

【2020/03/31記】
開発環境のPythonはCommand Line Tools for Xcode経由でインストールされたApple謹製の3.7.3だったのですが、ふと思い立ってbrew install ffmpegしたときに依存関係でアップデートされて、3.7.7になりました。
narou2az.pyは問題無く動いています。また、idle3が一緒に入ったので開発がしやすくなりました。
(本当はpyenvも入れてバージョンチェックできるようにした方がいいのかも知れませんが…)
Tcl/TkのWarningも気になりつつ、まぁぼちぼち
Warning_tcltk

【2021/05/03記】
今後、こちらのスクリプトは随時最新版に差し換えます。更新履歴および最新版の確認はGitHubをご覧ください(詳しくはこちら)。

| | | コメント (0)

« 2020年2月 | トップページ | 2020年4月 »