TeXで,画像ファイル.bb がないといわれる

画像をpdfファイルで指定したとき,bounding box に関し,以下の設定になっていれば,…bb ファイルがないと言われることはないはず

graphicx 読込み時に,ドライバに dvipdfmx が指定されている (dvipdfm ではダメ): \usepackage[dvipdfmx]{graphicx}

Beamer の場合には,\documentclass[uplatex,dvipdfmx]{beamer}

keywords: latex driver image file

Haskell の配列

Haskell で配列を使いたい場合,Data.Array.* を使うよりも,Data.Vector を使う方が良いらしい(Stack Overflowにあるすばらしい記事).

Tree の parent 関係が与えられたときに,child list を作成する例:

import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Mutable as VM
import Control.Monad.ST
import Data.Foldable

-- We assume that the root node is 0.  foo[i] is the parent node of node (i+1)
foo :: VU.Vector Int
foo = VU.fromList [0, 0, 1, 2, 0, 3, 1, 4]

-- revv[i] is the list of children of node i
revv :: V.Vector [Int]
revv = V.create f
 where
   f :: ST s (V.MVector s [Int])
   f = do
     let len = VU.length foo
     v <- VM.replicate (len + 1) []
     for_ [1 .. len] $ \i -> VM.modify v (i :) (foo VU.! (i - 1))
     return v
-- We could write "V.create $ do ...", but here I want to write the type of f.

もちろん,revv を作るためだけなら foo を Vector にする必要はない.

ファイルの読み込み: [Char] と ByteString

Haskell での性能の話.[Char] より ByteString が速いと聞いていたが,計ってみた.3桁以下の整数が十進で各行に1つずつ書いてあるファイルで,50万行,100万行,200万行 のものを用意して,それらを全部加える計算をする,以下のプログラムを走らせてみる.(ghc -O)

import System.Environment
import qualified Data.ByteString.Lazy.Char8 as B
import Data.Maybe
import Data.List

type IFold = (Int -> Int -> Int) -> Int -> [Int] -> Int

rStr :: IFold -> IO Int
rStr f = 
 getContents >>=
 return . f (+) 0 . map read . lines

rBS :: IFold -> IO Int
rBS f =
 B.getContents >>=
 return . f (+) 0 . map (fst . fromJust. B.readInt) . B.lines

body :: [Int] -> IO Int
body (1:_) = rStr foldr
body (2:_) = rStr foldl'
body (3:_) = rBS foldr
body (4:_) = rBS foldl'
body _ = error "Usage: p1 arg, where arg is either 1, 2, 3 or 4" >> return 0

main :: IO ()
main = getArgs >>= body . map read >>= putStrLn . show

結果は以下の通り.(単位は秒)

50万行 100万行 200万行
[Char], foldr 1.124 2.234 4.418
[Char], foldl’ 1.071 2.121 4.206
ByteString, foldr 0.062 0.093 0.158
ByteString, foldl’ 0.047 0.064 0.100

参照: Haskell Cafe の記事

keywords: haskell

moodle で課題評定一覧などにユーザ名を表示

moodle で,課題評定の一覧などにユーザ名 (username) が表示されない.ユーザ名に学籍番号を使っているので,学籍番号でソートすることができなくて不便である.デフォルトで表示されているのは氏名とメールアドレスである.このメールアドレスの部分は変更ができる.管理→サイト管理→ユーザ→パーミッション→ユーザポリシー→表示するユーザ固有情報 で選択すればよいのだが,あいにくここに username という選択肢がない.ソース (admin/settings/users.php) には,次のように書いてある:

 // Username is not included as an option because in some sites, it might
 // be a security problem to reveal usernames even to trusted staff.

なんだかなあ.そんなの,その管理者が判断して出さないようにすればいいだけじゃないか.デフォルトでは出ないようにしていれば問題ないだろうに.ともあれ,以下の変更で表示可能となる.

--- admin/settings/users.php-20171202 2016-03-12 08:38:07.000000000 +0900
+++ admin/settings/users.php 2017-12-02 07:50:56.240459183 +0900
@@ -180,6 +180,7 @@
 // Username is not included as an option because in some sites, it might
 // be a security problem to reveal usernames even to trusted staff.
 // Custom user profile fields are not currently supported.
+ // *** Changed by XXX 2017-12-02. Username added (ignoring security issues).
 $temp->add(new admin_setting_configmulticheckbox('showuseridentity',
 new lang_string('showuseridentity', 'admin'),
 new lang_string('showuseridentity_desc', 'admin'), array('email' => 1), array(
@@ -189,6 +190,7 @@
 'phone2' => new lang_string('phone2'),
 'department' => new lang_string('department'),
 'institution' => new lang_string('institution'),
+ 'username' => new lang_string('username'),
 )));
 $temp->add(new admin_setting_configtext('fullnamedisplay', new lang_string('fullnamedisplay', 'admin'), new lang_string('configfullnamedisplay', 'admin'), 'language', PARAM_TEXT, 50));
 $temp->add(new admin_setting_configtext('alternativefullnameformat', new lang_string('alternativefullnameformat', 'admin'),

もちろん,ソースを変更しなくても,たとえば「IDナンバー」(ID number) で代用するという方法もある.だけど,既存ユーザの該当フィールドに全部設定して歩かなくてはいけないし,また,このフィールドはユーザが変更することができてしまう,というのがいまひとつである.

SPIN のインストール

SPIN645あたりから,SPINのインストールがますます面倒になっている….今回は,Cygwin でなくMSYS2 を使うことにしてみた.

まず,MSYS2 のインストール.64bit用のバイナリをダウンロードして,インストール.基本的にMSYS2ウェブサイトに書いてあるとおりにやればよいのだが,最初の pacman -Syu のとき,途中で止まって帰ってこなくなる.(どうもそんなものらしい.) Ctrl-C とかをするべきではなく,ウィンドウごと終わって,別のMSYS2シェルを立ち上げてもう一回 pacman -Syu とするのが正しいらしい.

これが終わっても,gcc は入っていない.MSYS2シェルで次を実行する.

pacman -S --needed base-devel mingw-w64-x86_64-toolchain

どれをインストールするか? と聞かれるのだが,めんどくさいので全部インストールしてしまった.これで,gcc も動くようになった… のだが.

MSYS2 には,3つのパッケージが入っている.MSYS, MINGW64, MINGW32 である.このうち,MSYS は,管理業務を行うために使う.pacman とかその類.MINGW64 や,MINGW32 は,おのおの64-bitバイナリを作る時,32-bit バイナリを作る時に使う.で,3つのシェルをそのように使い分ければ良いはずだったのだが,なぜかMINGW64シェルを立ち上げても,MSYS2用のgccなどが動いてしまう.(結果として,できあがった .exe に対して ldd コマンドを実行してみると,msys2.dll に依存していることがわかる.)  この原因は,自分の $HOME/.bashrc で,/usr/bin を PATH に加えるように書いてあることだった.MSYS2用の gcc は,/usr/bin (として見える場所) に入るので,こういうことになるわけだ..bashrc を書き換えて,環境変数 MSYSTEM が定義されている時にはPATHを触らないようにした.

(もっとも,SPINを使うためにMSYS2を入れる,という観点からは,別にどうでも良いことではあるのだが.)

SPIN の main.c に,gcc-3 や gcc-4 があるかどうかを確認して,あったらそっちを動かす,というコードが書いてあるのだが,これが Windows だと機能しない.こんな感じになる.

E:\home\yo\windows\desktop\pc_spin647>spin.exe -a abp.pml
'gcc-4' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'gcc-3' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

(多分,627 の時には,そんなもんは無かったのに.) こころみにそこを削除してspin.exeをビルドしてみるとちゃんと動いた.しかし,それを人に使えと言うのもどうかとおもうので,回避策として,以下をとらせることにした

  • C:\msys64\mingw64\bin をパスの前の方に加える
  • そのディレクトリで,gcc.exe を gcc-3.exe, gcc-4.exe という名前でコピーする.

SPIN自体は,pc_spin647.zip を持って来て展開すれば良い.

参考になったページ:

神戸大「Spinのインストール」http://herb.h.kobe-u.ac.jp/spin_install_document.html

 

bottle を使ってみた.

Python の web framework である bottle を cygwin 上で使ってみた.おおむね良好.Python 3.6 で動かしている.

しかし,javascript から fetch() で呼ぶと,答が帰ってこない.cygwin でなく Windows にしてみても同じ.そのあといろいろアクセスすると無反応になったりして,どうもよくわからない.なんとなくではあるが,bottle が使っている wsgi webserver の reference implementation のせいではないかという気がする.

サーバを paste に変えてみたところ,ちゃんと動いているふうである.ただ,paste は開発が続いているのだろうか? 更新日が古いような気がする.とりあえず,pip3 install paste としたら入ったので,まあ良いのかもしれないが.インストールされた paste のコードに一箇所修正が必要だった.(大きなものをつくるとまだあるだろうという気がする)

--- /usr/lib/python3.6/site-packages/paste/httpserver.py~ 2017-11-25 13:40:29.185137200 +0900
+++ /usr/lib/python3.6/site-packages/paste/httpserver.py 2017-11-25 13:52:30.916417900 +0900
@@ -306,7 +306,7 @@
 for chunk in result:
 self.wsgi_write_chunk(chunk)
 if not self.wsgi_headers_sent:
- self.wsgi_write_chunk('')
+ self.wsgi_write_chunk(b'')
 finally:
 if hasattr(result,'close'):
 result.close()

アプリケーションのコードの方は,run() に,server='paste' という引数を加えればよい.debug=True だの reloader=True だのも一緒に指定できるようである.

cygwin での Jupyter Notebook の利用

まず,インストールする前に,python3-devel と python3-zmq を cygwin に導入しておく必要がある.(参照)

$ pip3 install jupyter

コマンドラインから起動するのだが,config file にブラウザを指定しておく必要がある.

config file をまだ作っていないのなら,次のコマンドで作成できる (参照).

$ jupyter notebook --generate-config

すると,${HOME}/.jupyter/jupyter_notebook_config.py が作成されるので,c.NotebookApp.browser を設定するコード (コメントアウトされている) 付近に,以下のように記述する (参照):

import webbrowser
webbrowser.register('chrome', None, webbrowser.GenericBrowser('/c/Program Files\
 (x86)/Google/Chrome/Application/chrome'))
c.NotebookApp.browser = 'chrome'

以下のコマンドラインから起動できるようになる.

$ jupyter notebook

 

cygwin emacs の auto-revert-mode でソケット関係のエラー

cygwin の emacs で,auto revert mode にしようとすると,Socket directory /tmp/fam-username has wrong permission だとか,Socket /tmp/fam-username/fam- has wrong permission だとかというエラーになる問題があった.

(Cygwinでなく) Windows explorer で該当のディレクトリ (/tmp/fam-username) のプロパティを開き,セキュリティタブで,以下のようにしたら,動作するようになった.

  • cygwinユーザ以外の全てのエントリを消去する.
  • cygwinユーザには,フルコントロールを与える.

 

 

haskell の stack space overflow

haskell の実行ファイルで,

Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.

と言われた.次のようにコンパイルし直せば良いらしい

ghc -rtsopts -with-rtsopts=-K1G hoge.hs

(1Gが妥当かどうかはわからないけど…)

追記: 今回の問題の場合には,-O を指定しておけば良かった,ということがわかった.-Oをつけて比較すると,-rtsopts -with-rtsopts=-K1G を指定すると時間性能が劣化した.

ビスケット

ビスケット (viscuit) . PPLで聞いた原田さんのソフトウェア.幼児~小学生にプログラムを書かせる.宣言的プログラミング.