2019年6月26日水曜日

縁起説

アッシジ長老がサーリプッタ長老に語ったとされる句:

Ye dhammā hetuppabhavā,

tesaṃ hetuṃ Tathāgato āha

tesañca yo nirodho;

evaṃvādī Mahāsamaṇo.

なぜか「諸法(事象・現象)が縁によって生じる」と解釈され、いわゆる「縁起説」として定着している。仏教の最も基本的な思想とされているが、この句の解釈は実は違うのではないか?

Ye dhammā は Tathāgato āha に係っているだけで、実質は hetuppabhavā, tesaṃ hetuṃ, tesañca yo nirodho と(四諦のうちの)三諦を言ったに過ぎない。「Ye dhammā Tathāgato āha」は単に、「如来が語られたこの法は」と言っていて、「方法(dhammā)」という単語に、事象・現象などと多義的な解釈を持たせて、何やら大げさな神秘性を帯びた体系に、仏教の位置付けを飛躍させる必要はなかったのではないかと思う。

hetuppabhavā は「原因から生まれる諸々の(複数形)もの」tesaṃ hetuṃ は「その原因(単数形)」、tesañca yo nirodho は「それら(原因から生まれた諸々のもの)が消滅するところの(原因に係る)」

つまり、全体を訳すとこうなる。

如来が語られたこの法というのは、

(一つの)原因から生じた諸々の結果(複数)と、それらの原因(単数)、

(その原因はまた)諸々の結果を消滅させる原因でもあるところのもの。

それ(その方法)を大沙門は説かれた。

結果が複数で、それら複数の結果の原因となっているものが単数であるというのが一つのポイントである(参考)。

そのように、神秘性の方向性なしに素直な話として解釈してみれば、その前後のコンダンニャ長老、サーリプッタ長老、モッガラーナ長老らの、最初に正見を得た時の常套句である、「生じるものは、滅する性質の云々」とイマイチ訳のわかったようなわからないようなセリフも、本来はどういうものであったかどうかが見えてくる気がする。つまり:

「諸々の結果を生じている一つの(大元となる)原因がわかれば、それは反対に諸々の結果を一挙に消滅させる鍵ともなるわけだ」

そういうやりとりだとすると、四諦→コンダンニャ長老の常套句、アッサジ長老の概説→サーリプッタ長老・モッガラーナ長老の常套句のやりとりが、まったく自然な受け答えだとわかるわけである。

仏教学者なんかで「縁起ガー、縁起ガー」なんて、縁起そのものが、もの凄い奥義のような概念として、釈尊が悟ったその内容の核心概念として奉り上げている人がいる気もするが、こんな風に解釈してしまうと、かなり根底部分から神秘性面で倒壊しかねないことになってしまうのかもしれない。

まあそれはおいておいて、上のようなごく自然なやりとりだったと解釈するのであれば、「その諸々の結果の原因となっている一つの物事を、見つけ出してしまえばいいじゃないの」ということになるわけで、その方法が仏法(Ye dhammā Tathāgato āha)であり、具体的にはウィパッサナー瞑想や、四念処といったものなのだろう。勘違いしないように念を押しておくが、「諸々の結果」を、この客観世界の万人、万物に普遍的な「事象」として拡大解釈し(dhammā に事象という拡大解釈を付したように)、その万人万物の普遍事象の、一つの統一的な根本原因を悟るのが仏教、なんていう風に、「その諸々の結果の原因となっている一つの物事を、見つけ出してしまえばいいじゃないの」という話のことを受け止めないように。各人において内的に、一つの原因と、それから生じている諸々の結果は千差万別である。ただ言えるのは、それ(原因と結果)が一対多対応の関係だというだけの話で、「この世にたった一つの原因と、あらゆる森羅万象と」の外的関係に風呂敷を広げては甚しい妄想で、大乗仏教はまさしくその愚の骨頂に陥ったわけであるが、パーリ経典が定まった段階でも既にこういう風に拡大解釈の萌芽が見られるという点には留意しておきたい。

2019年6月9日日曜日

日商簿記 3 級

今日、第 152 回の日商簿記 3 級試験を受験してきた。

自分は、商業高校出身でも、経済・商学系の大学出身でもない門外漢の理系人間。ゼロからの完全独学独習。勉強期間は 2 ヶ月足らず。

解答時間は 35 分程度だった。満点狙い。

3 級はおそらく、商業高校の生徒なら、多くが在学中に 2 年生くらいの時に(高得点とは限らないまでも)合格してしまうのではないだろうか? 2 級の方は経済・商学系の大学では推薦入学の要素にもなることから、商業高校の生徒でも優秀な生徒に限られるとは思うが。

使用した参考書・問題集は以下の 2 セットのみ:

公認会計士よせだあつこのパブロフ流シリーズ

『簿記教科書 パブロフ流でみんな合格 日商簿記3級 テキスト&問題集 第4版』(2019-02-20)

『簿記教科書 パブロフ流でみんな合格 日商簿記3級 総仕上げ問題集 第3版』(2019-02-20)

中央経済社の検定簿記シリーズ

『検定簿記講義 3 級 商業簿記〔2019年度版〕』(2019-02-27)

『検定簿記ワークブック 3 級 商業簿記』(2019-02-27)

まとめ

今 152 回から 3 級は大きく試験範囲が変わり、自営業向けだった内容が株式会社向けとなったので、参考書・問題集はちゃんと新しいもので揃えるというのがポイント。

上に紹介した 2 セットのものは、それぞれかなり性格が異なった毛色のものを組み合わせた。おそらく、それぞれが強調する視点が異っているので、片方だけでは、独学での満点狙いは厳しかったかもしれない。


結果

満点逃しました……orz

敗因

「455」を「445」と書き写しミスしたこと「のみ」による。これが満点を奪った、たった一つのミス。

書き間違えた445Kをベースに貸倒引当金の計算も行っているため、そこから派生した項目も影響を受けて、おそらく別の採点対象の項目も巻き添えを食ってしまい、計-6点となったものと思われる。

合計が合わなくなるミスであれば、気付くことはできたはずなのだが、これは貸借対照表と損益計算書の両方にセットで使われる値だったため、矛盾が発生せずに、気付くことにはならなかった。

パブロフ式の筆者自身でも見直し無しで解答時間が48分(参考)のところを35分で解けて、意気揚々と退出したわけだが、それがこの結果とは、トホホ……。

2019年4月18日木曜日

海外事務手数料

最近(2019-04-18 時点)、あちこちで mastercard / VISA 系の海外事務手数料の値上げが発生しているようなので、まとめてみた。(税込)

mastercard / VISA
VIEW1.63参照
エムアイ2.00参照
楽天1.63参照
セゾン1.63参照
Yahoo!2.20参照
JACCS1.63参照
Orico1.63参照
エポス1.63参照
ポケット(mastercard)1.90参照
三井住友2.20参照
MUFG2.16参照
d2.16参照
ポケット(VISA)2.16参照
Gold Point +2.20参照
セディナ2.20参照

mastercard / VISA は 1.63% が最安値だが、三井住友が 1.63 → 2.20% と改定していることから、他の mastercard / VISA 系も同様に 2.16% に改定する可能性が考えられる。

JCB
VIEW1.60参照
楽天1.60参照
セゾン1.60参照
Yahoo!1.60参照
JACCS1.60参照
Orico1.60参照
ポケット1.60参照
セディナ2.20参照
AmEx
楽天2.00参照
セゾン2.00参照

2019年4月11日木曜日

MySQL データベースのバックアップ

表のエクスポート

MySQL で表を丸ごとファイルにエクスポートする場合は、SELECT * FROM table を応用した INTO OUTFILE file による指定が基本となる:

SELECT * INTO OUTFILE '/mnt/data/tmp/sampletable.tsv' FROM Sample_Table;
  • ファイル形式は TSV(TAB 区切りでエスケープ方式が TAB 区切り特有のルールとなっている。CSV よりも遥かにスマートなフォーマット)
  • ファイルは上書き不可なので、既存の同名ファイルが存在してはならない。
  • 参考:MySQL 8.0 リファレンス
  • (出力先ファイル名や、表名などは一例)

エクスポートした表のインポート

反対にエクスポートした表をデータベースにインポートして書き戻す場合は次の命令が対応する:

LOAD DATA LOCAL INFILE '/mnt/data/tmp/sampletable.tsv' INTO TABLE Sample_Table;
  • エクスポートしたファイルを編集してデータエントリーを付け加えてインポートし直すと、元から存在したエントリーについては warning となり skip されるだけなので、気にせずにエントリーの追加用途に利用できる。

また、一部エントリーを元のデータに追加するのではなく、元のデータを修正して上書き更新したい場合であれば、TRUNCATE 命令を使って一旦消去してから全体丸ごと LOAD し直せばよい:

TRUNCATE TABLE Sample_Table;
LOAD DATA LOCAL INFILE '/mnt/data/tmp/sampletable.tsv' INTO TABLE Sample_Table;
参考:SHOW WARNINGS

LOAD の結果、追加したデータに何らかの不備があって WARNING が発生した場合は、直後に SHOW WARNINGS すれば WARNING 内容を確認することができる。

SHOW WARNINGS;

データベースのバックアップ

表の定義を含めたデータベースのバックアップは mysqldump コマンドを使う。こちらは SELECT 文のような SQL 上の操作ではなく、MySQL の対話モードの中で実行するものではなく、単独のシェルコマンドとしてインストールされるツールである:

$ mysqldump --databases Sample_Database > sampledatabase.sql
  • .sql ファイルは、データベースを復旧するための表定義の SQL 文などが含まれている。
  • SQL の命令文の中に、復旧すべき表のデータ内容が埋め込まれた形となっている。
  • 元々存在した表が削除・再作成されてデータがゼロから入力され直される形となる。
  • 参考:MySQL 8.0 リファレンス
  • (出力先ディレクトリ名や、データベース名などは一例)

ダンプしたデータベースのリストア

$ mysql Sample_Database < sampledatabase.sql

2019年4月7日日曜日

Python で Google SpreadSheets を CSV にエクスポート

OAuth2 を含めた gspread の説明は公式のリファレンス(12)が参考になる。

また、CSV へのエクスポートについては Stack Overflow の記事(Saving a google spreadsheet as a csv)を参考にした。

from oauth2client.service_account import ServiceAccountCredentials
import gspread
import csv

JSON_KEYFILE = 'XXX.json'
SPREADSHEET = 'テスト'
WORKSHEET = 'sheet1'
CSV_FILENAME = 'test.csv'

SCOPE = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
serviceAccountCredentials = ServiceAccountCredentials.from_json_keyfile_name(JSON_KEYFILE, SCOPE)
gspreadClient = gspread.authorize(serviceAccountCredentials)
worksheet = gspreadClient.open(SPREADSHEET).worksheet(WORKSHEET)

with open(CSV_FILENAME, 'w', newline='') as csvFile:
    writer = csv.writer(csvFile)
    writer.writerows(worksheet.get_all_values())

2019年3月31日日曜日

Inkscape 0.92.4

Inkscape (0.92.4) の macOS 版は MacPorts 版を使うべし。

MacPorts 版の Inkscape をインストールするには、もちろん、,MacPorts 自体をインストールして使えるように準備しておく必要がある。.pkg のインストーラーが使えるので、難しくはないはず。

そして、MacPorts によってインストールするのは、Inkscape だけでなく、X.Org Server も必要になる。

sudo port install inkscape
sudo port install xorg-server

これでターミナルから inkscape を実行すれば Inkscape が立ち上がる。

起動時の警告

起動時に、ターミナル画面に警告メッセージが表示されるが:

Dynamic session lookup supported but failed: launchd did not provide a socket path, 
verify that org.freedesktop.dbus-session.plist is loaded!
Failed to get connection

dbus とやらのセットアップに関するもののようなので、sudo port load dbus による指摘に従えば解消できる:

$ port notes dbus
dbus has the following notes:
  Startup items (named 'dbus-system, dbus-session') have been generated that
  will aid in starting dbus with launchd. They are disabled by default. Execute
  the following command to start them, and to cause them to launch at startup:
  
      sudo port load dbus

つまりこの場合 sudo port load dbus を実行して一度セットアップしてしまえば、以後は警告は出なくなる。

2019年3月16日土曜日

OpenWrt on WZR-HP-AG300H: nginx

デフォルトの uHTTPd に替えて当初は Apache を入れようとしたが、マトモに動かなかった(公式のフォーラムでもそのような話が出ていた)。それで諦めかけていたのだが、どうしても Virtual Host を実現したいので、nginx を入れてみることにした。

公式 wiki に従って(PHP は使う予定がないので、該当部分は飛ばした。)入れてみると、とても軽快で、さらに設定も /etc/nginx/nginx.conf に記載された内容で行うだけという、とてもシンプルなものだった。歴史が長過ぎて半ば妖怪化しつつあるような Apache と違って、一発で気に入った。

Virtual Host は nginx.conf で server {} を追加するのが基本。

ただし、デメリットも 2 点発生した。

  1. デフォルトでは HTTPS に対応していない
  2. CGI に対応していない

OpenWrt 用 nginx の HTTPS 化

nginx 自体は HTTPS に対応しているのだが、OpenWrt 標準の nginx モジュール(.ipk)は HTTPS 非対応でコンパイルされているため、自前で nginx モジュールをコンパイルして用意しなければならない。大変だったが(nginx の HTTPS 化そのものについては、一箇所しか情報が存在しなかったほど、情報が限られていた)、最終的に実現できた。

  1. 【下準備】Linux で git を使える環境を整える:
    apt install git-core build-essential libssl-dev libncurses5-dev unzip gawk zlib1g-dev subversion libncurses5-dev gcc-multilib flex gettext mercurial
  2. git clone して、ソースコードを用意する:
    git clone https://git.openwrt.org/openwrt/openwrt.git
    cd openwrt
  3. このままでは有無を言わさず最新のソースコードが使われてしまい、ライブラリーとのバージョンの不整合が起こるため、自分の使っている stable バージョンに絞って checkout する。
    git checkout v18.06.2
  4. make menuconfig
    Target System、Subtarget、Target Profile のみ、ルーターに合わせて適当に設定し、Build the OpenWrt SDK をチェックして SAVE -> EXIT。
  5. make V=s
    コンパイルが始まるので、時間がかかる。
  6. scripts/feeds update
    scripts/feeds search nginx
    scripts/feeds install nginx
  7. make menuconfig
    再度、menuconfig を立ち上げると、nginx に関するコンパイルオプションを設定できる状態になるので、望みのように設定して SAVE -> EXIT。
    network > Web Servers/Proxies にある。nginx そのものは M(モジュール)で選択し、さらに詳細はその中に入って設定する。Enable SSL module で HTTPS が有効になる(ついでで HTTP2 と LUA も有効にしておいた)。
  8. make -j5
    コンパイルし直す
  9. .ipk を拾い出す。bin の中にあるが、find コマンドを使って場所を特定するなどする:
    find . -type f -name nginx\*ipk
  10. .ipk をルーターに持っていって、opkg コマンドでインストールする。

OpenWrt で Let's Encrypt

acme.sh を使った。

wget なり、curl なりで acme.sh をダウンロードして、あとは acme.sh コマンドを駆使してお任せ。

root@WWW:~# ./acme.sh --install
It is recommended to install socat first.
We use socat for standalone server if you use standalone mode.
If you don't use standalone mode, just ignore this warning.
Installing to /root/.acme.sh
Installed to /root/.acme.sh/acme.sh
No profile is found, you will need to go into /root/.acme.sh to use acme.sh
Installing cron job
OK

socat なるものが必要とされるが、スタンドアローン・モードに限った話であり、スタンドアローン・モードで使う予定はないので問題なし。

root@WWW:~# cd .acme.sh
root@WWW:~/.acme.sh# ./acme.sh --issue -d scaredeer.com -d www.scaredeer.com -w /mnt/data/www/scaredeer.com --accountemail scaredeer@scaredeer.com
Registering account
Registered
ACCOUNT_THUMBPRINT='(省略)'
Creating domain key
The domain key is here: /root/.acme.sh/scaredeer.com/scaredeer.com.key
Multi domain='DNS:scaredeer.com,DNS:www.scaredeer.com'
Getting domain auth token for each domain
Getting webroot for domain='scaredeer.com'
Getting new-authz for domain='scaredeer.com'
The new-authz request is ok.
Getting webroot for domain='www.scaredeer.com'
Getting new-authz for domain='www.scaredeer.com'
The new-authz request is ok.
Verifying: scaredeer.com
Success
Verifying: www.scaredeer.com
Success
Verify finished, start to sign.
Cert success.
-----BEGIN CERTIFICATE-----
(省略)
-----END CERTIFICATE-----
Your cert is in  /root/.acme.sh/scaredeer.com/scaredeer.com.cer 
Your cert key is in  /root/.acme.sh/scaredeer.com/scaredeer.com.key 
The intermediate CA cert is in  /root/.acme.sh/scaredeer.com/ca.cer 
And the full chain certs is there:  /root/.acme.sh/scaredeer.com/fullchain.cer 

以上で、certification の issue が終わる(issue の段階では nginx.conf を更新・リロードしないこと。nginx が落ちてしまい、acme-challenge に失敗してしまう)。あとは発行した証明書を nginx 用にインストール。インストール先としては、nginx.conf で指定する予定の path(未だ存在しない場合は予め mkdir しておく)を使った。

root@WWW:~/.acme.sh# ./acme.sh --install-cert -d scaredeer.com -d www.scaredeer.com --key-file /mnt/data/www/scaredeer.com/cert/cert.key --fullchain-file /mnt/data/www/scaredeer.com/cert/cert.pem --reloadcmd "service nginx reload"
Installing key to:/mnt/data/www/scaredeer.com/cert/cert.key
Installing full chain to:/mnt/data/www/scaredeer.com/cert/cert.pem
Run reload cmd: service nginx reload
./acme.sh: eval: line 1: service: not found
Reload error for :

acme.sh が service コマンドを使った nginx の reload まで面倒を見てくれているが、何故かエラーになっている。自分で手動で service nginx reload すればいいだけなので、別に問題ない、はず。ただ、acme.sh は証明書の自動更新まで面倒を見てくれるようで、自動更新にこの --reloadcmd が関係している可能性もあり、今後自動更新が無事に行われるかどうかは、その時になってみないと不明。

Please take care: The reloadcmd is very important. The cert can be automatically renewed, but, without a correct 'reloadcmd' the cert may not be flushed to your server(like nginx or apache), then your website will not be able to show renewed cert in 60 days.

ともかく、(nginx.conf を更新した上で)service nginx reload して、実際に HTTPS でアクセスできるようになっていれば、無事終了である。

HTTP (80) を HTTPS (443) にリダクレクト

上で HTTPS 化にも成功したので、あとは、HTTP にアクセスしたら、自動的に HTTPS の方にリダイレクトするための設定で完成する。HTTP (80) の方の nginx.conf の該当する server ブロックの設定を次のように修正しておけばよい。

server {
	listen 80;
	server_name www.scaredeer.com scaredeer.com;
	return 301 https://$host$request_uri;
}

CGI の扱い

色々調べて試した結果、リバースプロキシで uHTTPd のポート(この例では 81)から出力結果を引っ張ってくるという対処方法に落ち着いた。nginx.conf の該当する server ブロック内に次の location ブロックを追加する:

location /cgi-bin {
	proxy_pass http://127.0.0.1:81;
}

2019年3月4日月曜日

OpenWrt on WZR-HP-AG300H: MariaDB

データベースとしては、MySQL 互換らしい MariaDB を入れた。

パッケージ

  • mariadb-server
  • mariadb-client

要点

  1. MariaDB 用に /etc/mysql/my.cnf の datadir と tmpdir を USB メモリーディスク(/mnt/data)下に作成した mysql ディレクトリと tmp ディレクトリに指定する。(my.cnf のコメントに、これらのディレクトリの配置場所として NAND フラッシュ領域を使わないようにと書かれている)
  2. さらに、/var/run に mysqld ディレクトリが存在しなければ、予め作成しておく。(mysqld.sock ファイルのために使われることになる。)
  3. my.cnf で Linux Native AIO を無効化しておく([mysqld] に innodb_use_native_aio = 0 を追加)。さらにスワップ(USB メモリーディスク参照)が有効だと、InnoDB のエラーが解消され、MariaDB-server が正常に動くようになる。
  4. (当然ながら)MariaDB-client もインストールしないと、mysql コマンド自体が使えない。動作テストができない。
  5. mysql コマンドで対話画面を起動して、ちゃんと動いているかを確かめる。システムログを見ると、InnoDB のエラーが出ていたりするのが確認できる。

mysqldump コマンドなど

1.4MB 以上を消費するが、mysqldump コマンドなども使いたい場合は、mariadb-client-extra のインストールも必要になる。

User/Password

デフォルトでは User: root; Password: (None) だが、デフォルト設定(/etc/mysql/my.conf)において

bind-address  = 127.0.0.1

となっていて、リモート接続が無効化されているので、セキュリティ的に気にする必要ないと思う。

OpenWrt on WZR-HP-AG300H: SFTP サーバー

/etc/config にある設定ファイルを扱う程度ならば scp コマンドで十分だが、WWW サーバーとしてセットアップすると、ファイルのアップロード作業が頻繁に発生するようになってくるので、FileZilla のような FTP クライアントを使ってファイルのやりとりが出来るように SFTP サーバーをセットアップしておくことにする。openssh-sftp-server をインストールする。

もちろん、SSH の拡張的な SFTP ではなく、ちゃんとした FTP サーバーの方をインストールする手もある。👉 FTP servers

OpenWrt on WZR-HP-AG300H: Python3

32MB フラッシュの WZR-HP-AG300H では、python3 のフルパッケージも問題なくインストールできた。

ただ、結局のところ、フルパッケージは「python3-light + 他の全ての追加パッケージ」に過ぎないので、必要になったら都度該当する追加パッケージを入れればいいだけだと思い、python3-light で入れ直した。

OpenWrt on WZR-HP-AG300H: uHTTPd

前の記事で USB ドライブを用意したので、それを前提として、uHTTPd がマウントされた USB ドライブを使うように設定することにする。

やったことは以下で、SSH で設定ファイルを直接編集して行なった。👉 uHTTPd Web Server Configuration

  1. uHTTPd 用に /etc/config/uhttpd の option home を linux home パーティションのマウントポイント(/mnt/data)下に指定する。
  2. /www/luci-static, /www/cgi-bin/luci のコピーを /mnt/data 下の対応する場所に置く

あとは、index.html を自前のものに変更するなりして、動作を確認した。デフォルトの index.html は、LuCI の管理画面である、/cgi-bin/luci にリダイレクトされるようになっているので、この index.html を別のものに変更してしまったとしても、直接 /cgi-bin/luci にアクセスすればちゃんと管理画面に入ることができるので、何も問題はない。

ちなみに、/etc/config/uhttpd を見ると、PHP や Perl は cgi-bin 以外の場所でも実行可能なように設定できるようだが、Python ではできないようだった(設定してみても、無効のようだった)。

また当初は uHTTPd の代わりに Apache を入れようとしたが、結局正常に動かなかった。

OpenWrt on WZR-HP-AG300H: USB メモリーディスク

VPN のセットアップまで一通り、ルーターやブリッジとしてのセットアップは一通り意図通りに整えられるようになった。次は、ルーターやブリッジとしてではなく、OpenWrt を使った自家用の省電力 WWW サーバーとしてのセットアップに取り掛かりたいと思う。

まず、WWW サーバー化にあたって、USB 接続の外部記憶領域が必要になってくると思う。USB の外付け HDD でも構わないだろうが、NAS は別に用意してあるから NAS 化したいわけでもなく、単に WWW サーバーの記憶領域として HDD を用意するのは本来の「省電力な自家用 WWW サーバー」という主旨に反し、自己矛盾した愚策な気もするので、USB メモリーを使うことにする。

基本的には、公式ガイドに従えば ok だった。👉 Using storage devices

導入したパッケージ

  • kmod-usb-storage
  • usbutils
  • block-mount
  • gdisk
  • e2fsprogs
  • kmod-fs-ext4
  • swap-utils

やったことの大まかなメモ

  1. USB を gdisk でパーティションに分け、パーティションの種類として、linux swap(WZR-HP-AG300H の RAM の 2 倍である、256MB にした)と linux home パーティションにした。
  2. home は mkfs.ext4 コマンドでフォーマット
  3. swap は mkswap コマンドでフォーマット
  4. あとは、LuCI (System > Mount Points) でそれぞれのマウントの設定をしておけば、起動時にマウントされる。ちなみに linux home パーティションのマウントポイントは /mnt/data にしておいた。
    特に、swap は、スワップファイルだと自動マウントされない。スワップパーティションにしておく必要があるようだ(swapon -a で有効化し、free -m でスワップがマウントされているかどうか確認できる。)

2019年2月24日日曜日

実家ネットワークの再構築

目標

WAN 直結の DMZ(192.168.0.0/24)と、純プライベートな内部 LAN 領域(192.168.1.0/24)の二段構成とし、DMZ へのゲートウェイとなるルーター(OpenWrt 機)にネットワークセパレーターとしての役割を担せ、そこで集中的にセキュリティ管理する。

現状

従来の構成は、管理上の平易さから、LAN は全て 192.168.0.0/24 のみで、WAN へのゲートウェイとなるルータを介して WAN に直結するフラットな一段構成である。今後 WWW サーバーを運用するなど外部向けの公開を念頭に入れると流石にセキュリティ上の懸念もあるため、WWW サーバーを置く DMZ とセキュリティを特に意識しないで済む内部 LAN 領域とに分け、この二種の領域の境界にネットワークセパレーターとしての OpenWrt 機を DMZ へのゲートウェイルーターとして置くという構成にしたいと考えるようになった。こうしておけば、たとえ WWW サーバーが侵入されたとしても、これを踏み台としてネットワーク的に分離された内部 LAN 領域に侵入されるわけではないので、内部 LAN 領域の安全性は維持できる(DMZ から 内部 LAN へのルーティングは行なわず、内部 LAN から DMZ への IP マスカレードによる一方的なアクセスのみ可能とする)。

デメリット

唯一のデメリットとしては、素人向けの話として丸暗記的に嫌われる「二重ルーター状態」になることで、UPnP に頼ることができなくなる点である。内部 LAN とそのゲートウェイルーターの間では UPnP を活用してもいいのだが、その設定内容に対応したポートマッピングを手動で WAN へのゲートウェイルーターにも設定する必要がある。とはいえこれは当然、得ようとしているセキュリティ上のメリットと表裏一体となる作業なのであるから、デメリットと呼ぶべきものではないことなのかもしれない。

暫定措置

理想としてはこのゲートウェイルーターに、Wi-Fi ブリッジ、OpenVPN サーバー、DHCP サーバーの役割も担わせた OpenWrt 機を当てたい所だが、現状、この位置にあるのはブリッジ運用中の NEC の Aterm WG1200HP で OpenWrt 化は無理。一方の手持ちの OpenWrt 機は WZR-HP-AG300H で、Wi-Fi 規格も古くこの要の位置に設置するには非力である。将来的には、Wi-Fi の AC 規格に対応した Netgear の R7800 あたりを入手して OpenWrt 化したものを配置したいと思っているが、現状はこのまま WG1200HP で行くことにする。

  1. ゲートウェイルーターの WG1200HP に OpenVPN サーバーや DHCP サーバーの役割を担わせず、ブリッジ運用からルーター運用に切り替えて、DMZ(192.168.0.0/24)と内部 LAN 領域(192.168.1.0/24)を区切るゲートウェイルーターとする。もちろん、Wi-Fi ブリッジとしての役目は従来通り。
  2. OpenVPN サーバーと DHCP サーバーの役割は、後方(別フロア)の Wi-Fi ブリッジである OpenWrt 機(WZR-HP-AG300H)に担わせる。
  3. 暫定措置の唯一のデメリットは、OpenVPN サーバーが奥のブリッジになってしまうという点である(DHCP サーバーを奥のブリッジに割り当てることによるデメリットは特にない)。トラフィック的に、ゲートウェイルーターに繋がった機器へのアクセスにおいて VPN 経由の通信が折り返して重複する形となる。実際には VPN はたまにしか使わないので、それほど気にすることではないのだが。
  4. もう 1 台の OpenWrt 機(こちらも WZR-HP-AG300H)は WWW サーバーや CGI/Python、DB(や、可能であればメールサーバー)の機能をセットアップし、DMZ に置く。ルーターとしての機能や(有線・無線を問わず)ブリッジとしての機能は不要である(ある意味、OpenWrt で Wi-Fi が正常に機能する機種という意味で選んだ WZR-HP-AG300H である必然性すらない。安価に入手できて省電力でそこそこ処理能力がある OpenWrt 化できる端末であればよい)。

OpenWrt on WZR-HP-AG300H: VPN サーバー

VPN は tun モードでセットアップした(が、それとは別に tap モードでもセットアップし、両立させた)。基本的には OpenWrt 公式のガイド(👉 OpenVPN Basic)に従ったが、必ずしも公式ガイドその通りに uci コマンドを使ってセットアップせずとも、コンフィグファイルを直接編集したり、一部の操作は LuCI でも代用できると思う。

PKI の準備

PKI をセットアップ(= Easy-RSA をインストール)し、必要な証明書等を生成する。これはガイドの通りにそのまま。 👉 OpenVPN Basic: PKI

VPN 用の仮想の物理インターフェースの作成と、論理インターフェースの作成

仮想の物理インターフェース tun0 を紐付けた論理インターフェース vpn_router を作成する。プロトコルは none(LuCI 上では Unmanaged と表示される)👉 OpenVPN Basic: Network

また、これは独自にやり方を見出したが、tap モードでセットアップすることもでき、物理インターフェース tap0 を作った場合は、論理インターフェースを新設せず、論理インターフェース lan の物理インターフェースの一つとして tap0 を追加するだけで良い(上のスクリーンショット。論理的に lan の一部として存在するので、tun モードの場合のように、Firewall の設定をする必要はない)。

OpenVPN Services

OpenVPN サービスをセットアップ(= openvpn-openssl をインストール)し、設定する。ガイドでは uci コマンドを使っているが、luci-app-openvpn をインストールすれば、LuCI の GUI でも代用できないことはないと思う。ガイドの uci コマンドでは環境変数を使って自動化している部分があり、何らかの理由で不具合がある場合には、あとで適宜設定を修正する必要があるかもしれない。また、VPN 用のネットワークアドレスも、自分で使いたいものに修正する。👉 OpenVPN Basic: VPN-Service

ポート番号が重複しないようにすれば、同時に、tun と tap のサーバー(上のスクリーンショットの router_server と bridge_server がそれぞれ該当する)を立ち上げることも可能。

Firewall

公式ガイドでは Firewall の設定を行っているが、当該機がルーターでセットアップ・運用されている場合に wan からの通信を vpn_router に通すためのものであり、ブリッジでセットアップ・運用されている OpenWrt 機の場合は wan ゾーン自体が削除されているため、関係ないだろう。
ゾーンとして vpn を定義し、lan ゾーンとの間でのトラフィックを全許可する。さらに Masquerading を設定するのが肝(下のスクリーンショットと次節参照)。👉 OpenVPN Basic: Firewall

Masquerading

当初は接続先ネットワークのゲートウェイルーターの静的ルーティング設定で強引に(?)VPN 専用ネットワークへのルーティングを可能にしていたため気付かなかったが、後に接続先ネットワークのゲートウェイルーターを静的ルーティング設定ができないもの(Aterm WG1200HP)に置換したことで、突如 VPN サーバー以外の接続先の LAN 側ネットワークに接続できなくなった。OpenWrt の Masquerading の設定なども試したものの打開できず、「ゲートウェイルーターが静的ルーティングすらできない安物だから」と一度本気で諦めたほどである。

しかし翌日ふと閃いて、Masquerading を、VPN 側ではなく、LAN 側で設定したところ、嘘のように問題が解消した。理論上からしても、Masquerading できれば静的ルーティングの必要性はまったくなかったわけだし、むしろ静的ルーティングしない方がセキュリティ上好ましいくらいである。

スクリーンショットに表示されているチェックこそが、tun モードでの VPN における重要で決定的な魔法だった。

追記(2019-03-10):proto 'tcp' にすべし!

これは OpenWrt での OpenVPN 特有の話ではないのだが、デフォルトの話として使用プロトコルは UDP ではなくて TCP にすべきである。何かどうしても TCP では嫌で UDP で高速化を図りたい人のみ、意図して UDP にすべきで、デフォルトでは OpenVPN というものは TCP を使うことにしておくべき。

当初、WiMAX 回線からの VPN サーバーへの接続で完全に全く問題がなかったので気付かなかったのだが、公衆 Wi-Fi を使ってみた時に、急に接続できなくなって一日ほどずっといじくり回して悩んでいた。プライベートネットワークアドレスの競合なのかなと悩んだり。公衆 Wi-Fi 側で VPN をフィルタリングしてブロックしている可能性も頭をよぎった(こういう邪推をする人はチラホラいるようである。だが、これは全くの大間違い、冤罪もいいところである)。

UDP が諸悪の根源であった。寝る前に海外の掲示板情報で「TCP にすべし」という情報をチラッと目にし、「ああ、昔 DD-WRT で初めて OpenVPN に取り組んだ時もそういう話を聞いたことがあったな、明日試してみよう」と思って眠り、翌日 TCP にした途端、嘘のように超絶安定化してサクサクと繋がるようになった。何てことだ。

世間では、VPN は「デフォルトが UDP で、問題があれば TCP」みたいな扱いだが、これ、逆だろう。

ハマり所についての考察

サーバー側のセットアップとしては、以上で、特に問題がなければ、難しい設定をする必要もなく上手く動いてしまう。動かない場合には、OpenWrt 機のネットワークやファイアーウォールの設定がおかしかったり、ネットワークのゲートウェイにおける、ポートマップが適切でなかったり、ルーティングが適切でなかったり、またOpenVPN クライアント側の設定が適切でなかったりである。自分の場合も当初は一発で上手く動かなかったので、できるだけ単純なネットワーク環境にして一つ一つセットアップし直してみたりしたが、最終的には、OpenWrt 機における上記の OpenVPN サーバー自体の設定に起因するミスではなく、ファイアーウォールの設定や、ネットワークのゲートウェイ側の設定、クライアント側の設定などが原因だった。OpenVPN 自体は、サーバーとクライアントで OpenVPN アプリが稼動している限り、同じ設定内容の設定ファイル(.ovpn)を使えば、通信できるようになっているので、暗号化方式のせいだとか、そういうところで失敗することは意外とないと思う。それ以前に、ネットワーク(ファイヤーウォール等)やルーティングが上手く機能していない可能性が高い。

VPN サーバーがセットアップ作業の一つの区切り

以上、VPN サーバー化によって、遠隔でも OpenWrt 機でのセットアップ作業を継続できるようになるのは大きい。

2019年2月23日土曜日

OpenWrt on WZR-HP-AG300H: ブリッジ化

WZR-HP-AG300H では初期状態ではルーターとしてセットアップされている。つまり、図においての物理インターフェース eth1 が論理インターフェスの wan に紐付けられている状態である。

Network > Interfaces 設定

なので、論理インターフェース的に wan と lan の二段構成になっている状態を解消して、単なるブリッジ状態にするには、LuCI 上で Network > Interfaces 設定で wan のエントリーを削除した上で、lan の Physical 設定で物理インターフェスの eth1 を lan に紐付け、さらに IPv4 のアドレス、ネットマスク、ゲートウェイ等の設定を UP ポート側の LAN に合わせたものにすればいい。基本的にこれだけで ok のはずである。

作業上の注意としては、先に wan のエントリーを削除して lan の設定をする前の段階で、一旦変更を反映させてしまうと、UP ポートが単に使えない状態になってしまい、UP ポートに LAN ケーブルを接続して設定作業をしていたならば、LuCI 自体にアクセスできない状態になり、焦ってしまうかもしれない点である。Wi-Fi か、LAN ポートに LAN ケーブルを接続すれば問題ないはずである。

Network > Switch 設定

初期状態では VLAN がセットアップされており、LAN ポート 1 〜 4 は、VLAN のノード 1 である eth0.1 に属している。VLAN を使わないのであれば、VLAN 関係の設定を削除して、単純に eth0 で扱っても良さそうだが、もしかしたら、一度試して支障が生じたことがあるかもしれない。現状ではデフォルトのまま放置している。

/etc/config/network

以上のような形で、/etc/config/network の内容は、wan のエントリーが削除され、lan のエントリー部分が以下のようになった:

config interface 'lan'
 option type 'bridge'
 option proto 'static'
 option netmask '255.255.255.0'
 option gateway '192.168.0.1'
 option broadcast '192.168.0.255'
 option dns '192.168.0.1'
 option ip6assign '60'
 option ifname 'eth0.1 eth1'
 option ipaddr '192.168.0.10'

もちろん、IP アドレスやゲートウェイ等の設定内容は、環境に依るので、ここでのポイントはインタフェースとして eth0.1 と eth1 がアサインされている点だろう。

ちなみに、LuCI 上では Wi-Fi の物理インターフェス wlan0 と wlan1 がアサインされているにもかかわらず、/etc/config/network 上では記載されていないのは、Linux(OpenWrt)の仕様である。論理インターフェースである lan がセットアップする段階では Wi-Fi に関するデバイスの初期化が追い付かず、後からセットアップされるため、/etc/config/wireless 側で紐付けされる論理インターフェースを定義することになる。そして LuCI の表示はこれらを総合した情報を出力している。

Network > Firewall 設定

初期状態のファイアーウォールの Zone のうち wan は存在しないので不要となり、削除した。

さらに、初期状態のファイアーウォールの Traffic Rules はすべて、ルーターとして機能する場合の wan ⇔ lan 間に関するものであり、lan ⇔ lan 間でブリッジとして機能する際に必要なものではない。完全に削除した。

OpenWrt on WZR-HP-AG300H: Timezone and NTP

System 設定

Timezone を Asia/Tokyo にした。

NTP サーバー候補には 1: ntp.nict.jp; 2: ntp.jst.mfeed.ad.jp; 3: openwrt.pool.ntp.org を入れておいた。

OpenWrt on WZR-HP-AG300H: SSH

Wi-Fi の有効化作業と並んで、SSH の有効化作業もその後の設定作業環境に関わる物事なので、最優先となる作業だ。

👉 SSH Configuration

System > Administration 設定

ルーターのパスワードを設定し、さらに SSH 用の公開鍵を登録しておく。

公開鍵を登録した場合、パスワード認証を無効化することも可能だが、現状では実質的に LAN 内部からしかアクセスできない状態のため、それほどセキュリティを心配する必要がないと考え、(Dropbear の設定で)特に無効化するようなことはしていない。むしろ現状では、設定を色々といじっていて、公開鍵認証でログインができなくなったりした場合に、パスワードで SSH ログインできないと面倒なことになるというリスクの方が大きい。

また、現状ではこの OpenWrt 機自体が LAN 内部からしかアクセスできない状態だが、そうではない(DMZ に設置したり、公開用の WWW サーバーを兼ねている等の)場合は、Dropbear の設定で Interface を LAN のものに絞っておくことによって、SSH が LAN 内部からしかアクセスできないようにすることができる。

二階堂重人氏のデイトレード本

二階堂重人『最新版 株デイトレードで毎日を給料日にする!』(すばる舎、2018-11-27)

株自体の入門書でもないのに、ロウソク足や信用取引についての説明にページ数を割くなど、どうでもいい情報があるので、「デイトレードのテクニックそのもの」についての情報は薄い。ポイントとしては 2 点程度か。

  1. デイトレ銘柄のキャッチの仕方
  2. チャートによる売買タイミング

以上の 2 つの次元で構成されるという点は特に目新しいものではない。銘柄の選別はランキングを使う等の漠然とした話で、ありふれた手法だと思う。唯一、この本の中で詳細かつ具体的に著されているのは、ボリンジャーバンドと変動平均を組み合わせた売買タイミングの方法だけだと思う。

著者のボリンジャーバンドと変動平均を組み合わせた売買タイミングの方法

  1. +2σ を上抜けする急上昇
  2. +1σ を割る反落
  3. 5 分足の 12 本変動平均(1 時間分)を割らずに反発
  4. +1σ を抜けて 12 本変動平均がサポートとなる押し目を形成したことを確認

以上で速やかに in する。

この手法の主旨としては、急上昇の動きをキャッチしようとするところ(トレンドフォロー)にあるが、+2σ を上抜けしたからといって、トレンドフォローが正解の場合と、反対に反落する逆張りが正解の場合があり、これだけではバクチとなる。そのため、一旦反落して押し目を作り、再度、本格的な上昇が開始する前に乗ってしまおうという作戦だろう。押し目狙いなので、まず一旦は反落して一休みする流れは必要であるが、押し目となって再度本格的な上昇が始まるか、そのまま反落して元の黙阿弥になってしまうかを、1 時間分の変動平均がサポートとして機能しているかどうかを基準にしているわけである。

空売りの場合はそのまま上下対称のやり方となる。

ちなみに、利益確定については、特に定まった手法はないようだ。

2019年2月20日水曜日

OpenWrt on WZR-HP-AG300H: Wi-Fi

OpenWrt をインストールしたら、まず最初に手を付ける作業が Wi-Fi。初期状態では Wi-Fi が無効化されているため、Wi-Fi を有効化しておかないと、有線 LAN で直結していないノート PC(Macbook)から作業できない、というのが個人的には決定的な理由。

Device 設定

2.4G 帯と 5G 帯それぞれ、Channel と Transmit Power を設定する。また、それぞれの Advanced 設定の Country Code も JP に設定しておく。

5G のチャンネルは auto で問題ないと思うが、2.4G の方は auto にすると、12ch 以降が選ばれてしまう場合があり、受信側端末によっては 11ch までしか対応していないこともあるので、手動で 1~11ch を選んだ方が良い。

あと、出力について、OpenWrt や DD-WRT ではパブロフの犬のように「出力が 10mW を超えると日本で違法どーだこーだ」の話になりやすいようだが、物好き者 dd-wrtの電波出力調整に関してによると:

電波法でいう10mWっていうのは、10mW/MHzです。 このMHzというのは帯域幅のことですので通常のWi-Fiは1chにつき20MHz幅です。つまり10x20=200(mW)までは日本の電波法の許す上限になります。28mWも63mWも可愛いものです。アンテナを4dBi程度のものにしてもまだまだ余裕があります。日本のホテルのロビーや公共施設なんかに備えられてるWi-Fiはもっと強いですよ。 ちなみに特小は1000mWまで無免許で使えますがWi-Fiは特小に含まれてません。 40MHz幅や80MHz幅のチャンネルを広く使って速度をあげる製品も出てますが、文字通りの解釈ですと10x40=400(mW)とか10x80=800(mW)がOKになりそうなものですが、総務省も馬鹿ではないので、40MHz幅の場合は5mW/MHz、80MHz幅の場合は2.5mW/MHz、160MHz幅の場合は1.25mW/MHzと明記してます。それなら最初から200mWまでって書けば良いのにと思いますけど。

ということらしい。WZR-HP-AG300H の OpenWrt の設定では、最高でも、規制上限 200mW の 1/3 未満の値の 63mW までしか設定できない。

Interface 設定

2.4G 帯と 5G 帯それぞれ、ESSID や Encryption、Cipher、Key を設定し、とどめに KRACK 対策を有効化する。

Encryption
WPA2-PSK(OpenWrt もいつかは WPA3 にアップグレードされるでしょう)
Cipher
Force CCMP (AES)
Key
他の家族の利用も考えると面倒臭いので、本体のラベルに記載されたものをそのまま流用した。

ちなみに、KRACK 対策は少々のオーバーヘッドと引き換えになるようであるが、公衆 Wi-Fi だとかのよほどのトラフィックの激しい環境でない限り、そこを気にするよりも、セキュリティの向上を採りたい。

WZR-HP-AG300H with OpenWrt

2 台目となる Buffalo の Wi-Fi ルーター親機 WZR-HP-AG300H をメルカリで入手した。ちなみに 1 台目は友人が不要になったものをたまたまもらっただけで、特に WZR-HP-AG300H であることを狙ったわけではない。もらってしまってから、DD-WRT というカスタムファームウェアに書き換えられること、それによって、OpenVPN が使えるということを知り、Buffalo 公式の OEM ファームウェアで使える(セキュリティ性能が脆弱な)PPTP ではなく OpenVPN を是非使いたかったので、それだけが目的で DD-WRT にしてみたという経緯であった。なので特に元の OEM ファームウェアに戻すことなど考えずに、その時はただ DD-WRT(v24-sp2 (12/22/14) std - SVN revision 25697)化した。

2014 年頃で DD-WRT の方は(少なくとも WZR-HP-AG300H 用については)安定版のリリースが停滞してしまっている(専らベータ版のみ)。せめて KRACK 対策された安定版が欲しいところ。一方、OpenWrt の方は今でも WZR-HP-AG300H 用の最新版が用意されている。

さらに、OpenWrt は色々と追加パッケージを自分で好きなように入れることができ、中には、Asterisk や Python やデータベースのパッケージもあるという。これは OpenWrt に俄然、興味を惹かれた。

またよくよく調べてみると、昔の時点だけでなく 2019 年の今に至るまで、OpenWrt 用の Buffalo 製ハードとしては WZR-HP-AG300H はメチャクチャ最適な機種らしいということがわかってきた。

型番の AG というのは、Wi-Fi の周波数が 5GHz 帯の IEEE 802.11a と 2.4GHz 帯の IEEE 802.11g の両対応という意味のようで、これ以前の機種や廉価版機種では G のみの型番のものが多く(それらはハードオフなどでも見捨てられてジャンクとして転がっている)、Wi-Fi 性能の点で一線を画している。さらに型番の 300 は IEEE 802.11n の通信速度 300Mbps のことだろう。

とはいえ、後に 3x3 MIMO(450Mbps)や 4x4 MIMO(600Mbps)の機種も登場しているし、IEEE 802.11ac という規格のものも出てきているので、Wi-Fi 性能の点ではもっと新しい世代の Buffalo のルーターもあり、そちらの方がなおさらいいのではないかと言うと、実はそうでもない。WZR-600DHP3 など後の世代のものは CPU 性能がさらに向上し、RAM もフラッシュメモリーもさらに容量が多くなっている。しかし、これら(ブロードコム系無線チップ搭載のもの)は、OpenWrt にファームウェアを書き換えると、Wi-Fi 機能が使えなくなってしまう。Wi-Fi チップに関する制御コードが暗号化されてしまっていて、自由に利用できないとか何とか、ビジネス的な事情によるもののようである。つまり現実問題として、Wi-Fi ルーターとして利用可能な OpenWrt 用の安価な中古ハードウェアとしては、WZR-HP-AG300H が最善の選択となってしまうみたいなのだ(金に糸目を付けなければ、Netgear の R7800 あたりに OpenWrt を載せてみたいものだが)。

1 台目が WZR-HP-AG300H となったのは単なる偶然だったが、今回の 2 台目はそういうことで狙ってこの WZR-HP-AG300H を入手した。1 台目の DD-WRT を OpenWrt に書き換えても良かったのだが、1 台目を DD-WRT に書き換えた時は特に何も戻すこと等は考えていなかったので、オリジナルの OEM ファームウェアのバックアップを取ることなどもしておらず、片道切符での作業だった(調べてみたら、バックアップを使わずとも戻せるので、この点は気にしなくてもよかったことだが)。そういったこともあって、現に運用中の DD-WRT の WZR-HP-AG300H をぶっつけ本番で OpenWrt 化するのはためらわれたので、たかだか 1000 円程度で入手できるものであるからと、2 台目をメルカリで確保し、これを使って安全に気の済むまでいじってみることにした。

OEM ファームウェア(メルカリ入手時 1.72)のバックアップ作業やその検証

mkdir /mnt/usb0_0/firm1.72
dd if=/dev/mtdblock/0 of=/mnt/usb0_0/firm1.72/mtdblock0.bin
dd if=/dev/mtdblock/1 of=/mnt/usb0_0/firm1.72/mtdblock1.bin
dd if=/dev/mtdblock/2 of=/mnt/usb0_0/firm1.72/mtdblock2.bin
dd if=/dev/mtdblock/3 of=/mnt/usb0_0/firm1.72/mtdblock3.bin
dd if=/dev/mtdblock/4 of=/mnt/usb0_0/firm1.72/mtdblock4.bin
dd if=/dev/mtdblock/5 of=/mnt/usb0_0/firm1.72/mtdblock5.bin
dd if=/dev/mtdblock/6 of=/mnt/usb0_0/firm1.72/mtdblock6.bin

ubootenv set で変数を一種類のみ変更して前後でのファームウェアイメージの変化を調べたところ、mtdblock1 以外に mtdblock4 にも変化が見られた。また、純正ファームウェア上での「設定初期化」では、ubootenv の変更はリセットされなかった。dd コマンドによる mtdblock1 の書き戻しで、ubootenv list の内容がリストアされることも確認した。一方、mtdblock4 は ubootenv set の前後のいずれとも一致しなかったので、起動毎に構成されるような一時的なデータが格納されるものと思われる。

さらに 1.72 → 1.73 へのアップデートで、mtdblock2、mtdblock3、mtdblock4、mtdblock6 が変化した。やはり、mtdblock0 は U-Boot 本体であるから不変であるべきであろうし、mtdblock5 の ART というのは、シリアル関係のファームなのだろうか、OS とは別個のものなのだろう。

OpenWrt ToH の Flash Layout によると、サイズから推測するに、OpenWrt では、rootfs_data 用の領域が増えているだけで、残りの 7 ブロックについてはサイズ的に一致している。一方、DD-WRT の方は、U-Boot(RedBoot に変更される)も含めて大幅に書き換えられているようである。

ubootenv コマンドによる TFTP の有効化等

OEM Web UI のデバッグモードにてコマンドを実行:

ubootenv set accept_open_rt_fmt 1
ubootenv set region US

OEM ファームウェア 1.73

オリジナルの OEM ファームウェアでは 1.73 がベスト。デバッグモードが使えて、ubootenv コマンド(TFTP の有効化と、リージョン変更のために必要)や dd コマンド(オリジナル状態の ROM イメージをバックアップしておくために必要)等が実行できるから。1.74 以降はデバッグモードが無効化されている。

OpenWrt(や DD-WRT)へのファームウェアの載せ替え作業自体は、デバッグモードが使える(1.73 以下である)必要はなく、(1.74 以降であっても)Web UI からのアップデートでインストールが可能である。

文鎮化

何度かネットワーク設定を誤って文鎮化したことがあった。TFTP リカバリー機能(予め、OEM Web UI で ubootenv コマンドを使って TFTP を有効化しておく必要がある。この方法が使えないと、殻割りしてシリアルコンソールによるデバッグ方法しか手段が残されていない)を使って回復させた。

OpenWrt を TFTP リカバリーから入れられるようにするため、ubootenv で region を US にしていたため、日本版の OEM ファームウェアは入れられなかったので、US 版の OEM ファームウェア(ちなみにバージョンは 1.78)を使う必要があった。

また、OEM ではなく、OpenWrt でリカバリーする場合には、TFTP 用のファームウェア必要となるが、15.05 のファームウェア openwrt-15.05.1-ar71xx-generic-wzr-hp-ag300h-squashfs-tftp.bin が現時点で最新の TFTP 用であり、一旦 15.05 で復活させて、それを 18.06 にアップグレードする形で復旧した。

TFTP サーバー機としては、Windows10 機を使った。手持ちの Macbook には有線 LAN の接続手段が無く、Linux 機もスイッチングハブを介さないケーブル直結状態では ip コマンドが失敗するので、Windows に落ち着いた。1: netsh コマンド; 2: arp -a コマンド; 3: tftp -i コマンドの計 3 行のコマンドからなるバッチファイル(recover. bat)を使ってタイミングを測って実行するやり方で上手く行った。

Technical Glossary

U-Boot (Universal Boot Loader)
組み込み機器における、PC-Linux にとっての BIOS + GRUB の部分に相当するもの。もちろん WZR-HP-AG300H にも使われている。この U-Boot が、OEM ファームウェアの Web UI なり、OpenWrt なりを起動してバトンタッチすることになる。つまり、(オリジナル、OpenWrt、DD-WRT の)Web UI によるファームウェアの書き換え処理によって変更されるのは、U-Boot によってバトンが渡される先の OS 本体の部分についてであって、(恐らく)U-Boot は不変である(ただし、mtd コマンド、dd コマンド、cat コマンド等で書き込み先を指定して直接書き込みを行う場合には、そこがたとえ U-Boot の部分であっても書き込めてしまうだろうから、くれぐれも書き込み先の指定は間違えないように注意する必要がある)。
TFTP (Trivial FTP)
U-Boot が備えている機能の一つで、ネットワークからファイルをダウンロードする。ブート用の OS のカーネルイメージをネットワークから読み込(んで、Flash ROM に書き込)むのに利用されている。Buffalo が TFTP を応用したこのような機能を用意しているのは、何らかの理由でファームウェアが壊れた場合に、ファームウェアを改めて書き込み直すというリカバリー手段としてであろう。日本版の WZR-HP-AG300H ではデフォルトでは TFTP が U-Boot の環境変数(フラグ)で無効化されている。
WZR-HP-AG300H の TFTP リカバリー機能
WZR-HP-AG300H の IP アドレス: 192.168.11.1; MAC アドレス: 02:aa:bb:cc:dd:20; TFTP サーバー(PC)の IP アドレス: 192.168.11.2; 待ち時間 4 秒(ubootenv で tftp_wait を 4 秒よりも長い時間に変更できるが、実際には効果がないように思われる)。
👉 BHR-4GRVでのTFTPインストール方法(DD-WRT OpenWrt 適材適所で両方使いたい人向け)BHR-4GRV 用の説明だが WZR-HP-AG300H と基本的に共通している。
👉 WZR-HP-AG300H を tftp で純正ファームに戻す(ばっくらっしゅの備忘録)実際の作業上のタイミングを知る上で、ここの写真入り解説が一番わかりやすい。
👉 WZR-HP-AG300H(OpenWrt ToH)
👉 De-bricking and TFTP Info(DD-WRT wiki)
OpenWrt ファームウェアの種類
***-squashfs-factory.bin(OEM Web UI → OpenWrt)
***-squashfs-sysupgrade.bin(OpenWrt → OpenWrt)
***-squashfs-tftp.bin(U-Boot の TFTP リカバリー機能を用いた OpenWrt 化)
DD-WRT からの OpenWrt 化
DD-WRT の linux ブロックは、OpenWrt の firmware ブロック(さらには OEM ファームウェアの ブロック 6)に相当するようだ。***-squashfs-sysupgrade イメージがそのブロックの中身そのもののようである。
👉 DD-WRT化したWZR-HP-AG300HからOpenWRTのインストール方法(DD-WRT OpenWrt 適材適所で両方使いたい人向け)
👉 オリジナルfirmwareへの復旧方法 > OS上から > CLIコンソールからの復旧(DD-WRT OpenWrt 適材適所で両方使いたい人向け)
OEM ファームウェア上でのファームウェアイメージのバックアップ
👉 BHR-4GRVでのTFTPインストール方法(DD-WRT OpenWrt 適材適所で両方使いたい人向け)dd コマンドによるバックアップが丁寧に記載されている。
👉 ファームウェア・設定ファイルなどのバックアップ・書き込み(DD-WRTまとめwiki)バックアップされるイメージは U-Boot 用のイメージなので、バイナリーが「27 05 19 56」で始まるファイルのはず(未確認)。
OEM ファームウェアのデバッグモード
1.73 以下で、user: bufpy; pass: otdpopy(ところで、bufpy の buf は Buffalo の buf なんだろうけけど、py とか otdpo は何を意味しているのだろうか?)
ubootenv set コマンドで環境変数(accept_open_rt_fmt, region 等)を変更できる。ubootenv list で環境変数のリストを表示できる。
👉 WZR-HP-AG300H、デバッグモードに入り telnetdを起動(ばっくらっしゅの備忘録)
👉 デバッグモードによるファーム書き込みでWZR-HP-AG300HをWZR-600DHPに変身(物好き者)
👉 今日のお品。WZR-600DHP ハードウェア的には WZR-HP-AG300H と同等品の WZR-600DHP だが、ダウンロード配布されている OEM ファームウェアが暗号化されているかいないかという違いがあるようだ。OEM ファームウェアしか使わないのであれば、WZR-600DHP 化して喜んだりするのもありだが、OpenWrt 化を前提にすると、改悪版以外の何物でもない。
DD-WRT での NVRAM リセット方法(未確認)
telnet で 1) erase nvram 2) reboot
👉 【Buffalo】 DD-WRTから元に戻す & OpenWrtの導入 【改造】

OpenWrt 化後の作業

  1. Wi-Fi
  2. SSH
  3. Timezone、NTP
  4. ブリッジ化
  5. VPN サーバー
  6. USB Drive
  7. WWW サーバー(uHTTPd)
  8. Python3
  9. MariaDB
  10. SFTP サーバー

OpenWrt 化後の作業例:👉 OpenWrtを設定していく

2019年1月28日月曜日

西澤ロイ『頑張らない英文法』

図書館で予約していた、西澤ロイ『頑張らない英文法』(あさ出版、2014年)が 2、3 年以上かかって順番が回ってきた。

自分自身が独学で体得していたことが、大学の英語学科で学んだ専門家の言っていることとほとんど一致していることを確認できた。筆者がこの本で解説していることは、基本的に中学英語の範囲の文法事項だが、この中学英語の範囲の文法事項を、このような形で理解しているということが重要である。テスト勉強用の知識としていくら中学英語を 100 点満点の状態でインプットできていたとしても、意味がないのである。

個人的には、自分のような体得に至っていない人には、この本は自分が人に英語を教える時に強調して言っていることと重複しているので、購入、一読をお勧めできる本である。

自分自身として、この本を読んで一つだけ、得られたことは、情報の先後で意味合いが違うため、能動態と受動態といったような書き換えられた文の意味に違いが生じるという点である。情報の先後による違い自体は自分なりに理論を構築していたが、能動態と受動態などの書き換えによって生じる意味の違いについては、特に生じるか生じないかということ自体を意識することはなかったため、これについては一つの収穫だった。

自分が理工学系的発想で築いた独自理論は、筆者がこの本で解説しているものよりも、さらにアグレッシヴにカスタマイズされているのだが、少なくとも、この本に書かれていることは、自分が学校教育の英語の文法とは違って独自に編み出したものと、同じ考え方が述べられていたので、それが決して的外れな我流理論というわけでもないことが確認できて良かった。