Windows の hosts ファイル

Windows で, /etc/hosts に相当するのは, C:\Windows\System32\drivers\etc\hosts であるが,この,permission を適当にいじると動作しなくなる.通常ユーザでは書き込み禁止になっていていちいちうるさいので,通常ユーザに書き込み権を与えたところ,動作しなくなってしまった.パーミションを元に戻したら,また動くようになった.
余計なお世話だなあ…

moodleで課題の評点やフィードバックを一括アップロード

moodle で,課題の評点を一括アップロードするのに「インポート」を使っていたが,フィードバックが学生の画面にちゃんと反映されないという問題があった.
そうではなく,「評定ワークシート」を使えば,そういう問題は無いようだ.
課題作成の時に,「フィードバック」のところで,「オフライン評定ワークシート」にチェックを入れておく.
提出一覧を表示した時の「評定操作」ドロップダウンリストに「評定ワークシートのダウンロード」なるものが追加されている.
このダウンロードした評定ワークシートに,評点とフィードバックを書き入れて,「評定ワークシートのアップロード」を行えば良い.

その際,不要そうな列は削除しても良いが,以下の3つは削除してはいけない:

  • ID
  • 評点
  • 最終更新日時(評定)

これらがないと,CSVファイルでないとかなんとか言われる.もちろん,フィードバックをアップロードするのなら,フィードバックの列も必要である.

日本語で使っていると,「更新されているレコードがない」とかなんとか言われてアップロードは常に失敗するようだ.
これは,「スプレッドシートよりも最近にMoodle内のレコードが修正されている場合、レコードの更新を許可します。」にチェックマークを入れることによって
回避可能.一応追いかけてみたところ:
mod/assign/feedback/offline/locallib.php の155行目:
$stalemodificationdate = ($usergrade && $usergrade->timemodified > ($modified + 60));
で$modifiedが日本語の時には常に0になっているので,レコードが stale だと判断されるため,このような動作になる.
$modified というのは,ダウンロードした時のスプレッドシートに入っている「最終更新日時(評定)」で,
ここには,日本語で日時が記録されているのだが,それを mod/assign/feedback/offline/importgradeslib.php の194行目
$result->modified = strtotime($record[$this->modifiedindex]);
で,整数にしている.この時点では,LANG=Cだと思うので,変換ができないということであろう.その日本語の日時文字列は,
どうもSQLで返してきている値なのではないかと思われる (詳細未確認).

keywords: assignment grade feedback import upload moodle

phpMyAdminのSQLボックスのフォント変更

xampp (というか,phpMyAdminだろうな) のバージョンによって,直すべきファイルが違うらしい.今回の場合には ${XAMPP}/phpMyAdmin//js/codemirror/lib/codemirror.css だった.この,
.CodeMirror preのところに,

  font-family: inherit;
  font-size: inherit;  

という指定があるので,

  font-family: Myrica M;
  font-size: 16px;

と書き直した.なお,.CodeMirror pre の指定自体が2箇所あった.

keyword: フォントサイズ fontsize font size

minttyのフォント

minttyのフォントを Myrica というのに変えてみた.ちゃんと日本語文字:ASCII文字が2:1になっている.なかなか良い.
– 半濁音と濁音の区別がはっきりつく
– Oと0がはっきり区別される
だけど,MS ゴシックも良いフォントだと思う.行間が空かずに無駄なく使えるのが良い.
たとえば同じ12ptで画数の多い漢字を出すと,MSゴシックなら,各線がはっきり見えるが,MyricaMだと (他のたいていのフォントでも) つぶれてしまう.

virtualboxの自動起動

Windows10が立ち上がるときにvirtualbox (Ubuntu) をheadlessで起動しておいて,シャットダウンの時にvirtualboxもシャットダウンされる,ということをしたかった.….難しい.
起動すること自体は,もちろん,別になんでもなくて,C:\Program Files\Oracle\VirtualBox\VBoxManage.exe startvm 仮想マシン名 --type headlessを実行すれば良い.終わるときにはC:\Program Files\Oracle\VirtualBox\VBoxManage.exe controlvm 仮想マシン名 acpipowerbutton で良い.(ただし,Ubuntu は ACPI shutdown のシグナルが送られてきたときに,ユーザに対処を選ばせるようになっているので,そうならないように,/usr/share/acpi-support/power-funcsというシェルスクリプトを作って,なかにshutdown -h nowと書いておく必要がある.この辺が参考になる.)
問題はそれをどこでやるか.
Windowsが起動するときとシャットダウンされるときに動かすスクリプトというのを,グループポリシーなるもので設定できるという話なので,やってみたのだが,うまくいかない.そもそも設定したはずのスクリプトが呼ばれない.ずいぶん調べて,やっと,Windows10ではfast startup なるおせっかいな機能がデフォルトになっていて,そのモードでは,これらのスクリプトが呼ばれない,ということがわかった.(それなので,シャットダウン・電源ON ではなく,再起動を選ぶと,ちゃんと呼ばれる.) で,fast startup なるものを無効にしたのだが,今度はスクリプト自体は呼ばれたのだけれど,VBoxManage が動かない.どうも仮想マシン名はユーザ毎に別々に認識するようになっていて (なるほど.そうだよなあ…) したがって,ログイン後でないとだめだということのようである.
しからば,ということで,Windowsの起動時・終了時ではなく,ユーザのログイン・ログオフ時のスクリプトにしてみたのだが,やはりなんだかうまくいかない.しかもこれらは,全ユーザのログイン・ログオフ時に動いてしまう.(まあ,このマシンにはユーザは1人しかいないから良いようなものだけど.)
ということで,結局,ユーザ毎のログイン時に動かすスクリプトを置く場所%UESRPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup に,起動スクリプトは置くことにした.終了の方はあきらめた.起動したままログオフしようとすると警告が出るので,その時に手で (virtualboxの管理画面を開いて) 終わればいいや.ということにした.もう少し頭が冷えたらまた考えよう.

追記: 管理者権限で起動しないと,シンボリックリンクが作成できないことがわかった.上記の起動スクリプトを置くのではなく,タスクスケジューラでログオン時に起動するようにした.そこで「最上位の特権で実行する」というオプションを指定する.

VirtualBox & XWindow

Windows 10 を host OS, Ubuntu を Gues OS で,virtual box で動かしている.X Server を Windows で動かそうとして,いろいろつまずいた.最終的にはこんな感じ.
まず,X Server はいろいろ選択肢があるようだが,とりあえず Cygwin X server にしてみた.普通のCygwinの部品のインストーラに,Xに関するものも入っている.https://x.cygwin.com/docs/ug/setup.html#setup-cygwin-x-installing の項目15のところに必要なもののリストがある.

ホスト の /etc/hosts に,virtualbox を書いておく.

127.0.0.1 virtualbox

ホスト の ~/.ssh/config に,以下のセクションを入れる.

Host virtualbox
  User (ゲストのユーザ名)
  Port 19022
  ForwardX11Trusted yes
  ForwardX11 yes

ゲスト の /etc/ssh/sshd_config

X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost no

virtualboxマネージャの 設定→ネットワーク→高度→ポートフォワーディングに,(ssh,TCP,,19022,,22) を追加.
ログインする時には

$ DISPLAY=:0 ssh virtualbox

これでログインした状態でXのクライアント,たとえば xlogo を打ってみると,ちゃんとX server に表示される.ログイン時に自動的に環境変数DISPLAYに (ホスト名):10.0 が設定されている.
次は,日本語を入力したい.リモート側では,環境変数 XMODIFIERS に値 @im=fcitx が設定されている必要があるようだ.この状態で,リモートで,fcitx コマンドを実行する.コマンド自体は一瞬で返ってくるが,fcitx のデーモンプロセスが起動される.なお,VirtualBoxのウィンドウ(?)で fcitx が動いていても,それは別物なので,ログインしたターミナルでも動かさなくてはいけない.さらに,(XMODIFIERSはもちろん設定されたままで) X クライアント,たとえばemacsを動かすと,そこで日本語を入力することができる.(これらは,ログインした時に自動的に起動するように設定できるはずだと思うが,まだ調べていない.下手に設定すると,VirtualBoxのグラフィカル環境と衝突するのではなかろうか)

keywords: virtualbox, port forwarding network

latexmk と sumatra

latexmk -pvc で,sumatra PDF をプレビューに使っている.
Windows10だと(???),latexmk の rc ファイル (~/.latexmkrc./.latexmkrc など) に,

$pvc_view_file_via_temporary = 0;

が必要であるようだ.これが無いと,-pvc の時には temporary directory に pdf ファイルを作成し,もとのpdfを消し,移動する,という手順になるが,これだと,sumatra が変更を検知できないようだ.

hugo + wsgi 作業メモ

hugoを使ってhtmlファイルの静的生成はしたいが,アクセスは制限して,ログインユーザだけに読ませるようにしたい.
アクセスコントロール部分は,bottle を使って小さなプログラムを書き,username/password をチェックするようにした.
bottle 自体はセッション機能を持っていないが,bottle-beaker プラグインを使うことで,beaker のセッション機能を利用することができる.
Web サーバは,apacheを使うことにした.mod_wsgi を入れる.希望としては,特定の https://host/app1/… の時だけアプリケーションに制御が渡って,そうでない https://host/dir1/dir2/file.html のときには,普通にファイルを見てほしかったのだが,問題があった.そうするためには,

  WSGIScriptAlias / /var/www/...

とするわけにはいかない.これだと,全部 WSGI がひったくってしまう.

  WSGIScriptAlias /app1 /var/www/....

といった具合に書かなければならないと思うのだが,この時,bottle の @route(…) でチェックする path に,/app1 が取り除かれたものが渡ってくる (ように思える.あまりちゃんとは見ていない).一方,bottle スクリプトを普通に走らせた場合 (開発時) には,当然ながら /app1/… の形で渡ってくる.この両方に対応するように書くのは面倒くさい.書けなくはないだろうと思うが,少なくともちょっとやっただけではうまくいかないところがあった.
で,やむを得ず,非標準のポートを使って,それ用の VirtualHost を使うことにした.URLがみっともないが.だったらはじめからWSGI専用Webサーバを使った方が楽だったかもしれない.
さて,WSGIアプリは,認証のためだけに使うのだが,認証が通ったらあとはファイルの中身を返すだけ,かと思っていたら,けっこういろいろやらなくてはいけないことがあった.
まず,ディレクトリ名でアクセスが来たら,そこの index.html を返さなくてはいけない.(当面 .html しかないのでそれ以上のことは考えない) これも,https://…/dir/ というアクセスが来たら,そのまま index.html の中身を返せば良いが,https://…./dir の場合にはそれではうまくいかない.html の中に a タグがあって,href が相対パスで書いてある場合,ディレクトリが違ってしまうからである.そこで,この場合には https://…/dir/ へリダイレクトする.(無駄だ…)

雑感: これで小グループ用のウェブサイトを作ったとして,この技術が何年持つか?