画像をpdfファイルで指定したとき,bounding box に関し,以下の設定になっていれば,…bb ファイルがないと言われることはないはず
graphicx 読込み時に,ドライバに dvipdfmx が指定されている (dvipdfm ではダメ): \usepackage[dvipdfmx]{graphicx}
Beamer の場合には,\documentclass[uplatex,dvipdfmx]{beamer}
keywords: latex driver image file
画像をpdfファイルで指定したとき,bounding box に関し,以下の設定になっていれば,…bb ファイルがないと言われることはないはず
graphicx 読込み時に,ドライバに dvipdfmx が指定されている (dvipdfm ではダメ): \usepackage[dvipdfmx]{graphicx}
Beamer の場合には,\documentclass[uplatex,dvipdfmx]{beamer}
keywords: latex driver image file
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 にする必要はない.
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 で,課題評定の一覧などにユーザ名 (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) で代用するという方法もある.だけど,既存ユーザの該当フィールドに全部設定して歩かなくてはいけないし,また,このフィールドはユーザが変更することができてしまう,というのがいまひとつである.
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をビルドしてみるとちゃんと動いた.しかし,それを人に使えと言うのもどうかとおもうので,回避策として,以下をとらせることにした
SPIN自体は,pc_spin647.zip を持って来て展開すれば良い.
参考になったページ:
神戸大「Spinのインストール」http://herb.h.kobe-u.ac.jp/spin_install_document.html
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
だのも一緒に指定できるようである.
まず,インストールする前に,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 にしようとすると,Socket directory /tmp/fam-username has wrong permission だとか,Socket /tmp/fam-username/fam- has wrong permission だとかというエラーになる問題があった.
(Cygwinでなく) Windows explorer で該当のディレクトリ (/tmp/fam-username) のプロパティを開き,セキュリティタブで,以下のようにしたら,動作するようになった.
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 を指定すると時間性能が劣化した.