LaTeXで数学のプリントや試験問題を作るためのパッケージにemathというものがあります。けっこうたくさんのファイル(現時点で178個のファイル)から構成されるパッケージなのですが,なぜかCTANのようなお手軽システムを使ったインストールはできず,独自に手動でインストールせねばなりません。ファイルが1個か2個で構成されるなら.texファイルと同じディレクトリに置いておけばよいのですが100個以上のファイルをカレントディレクトリにばら撒く気にはちょっとなりません。
というわけで,手動でインストールします。
1. 配布元のトップページの中程にある「入口」をクリック。
2. 「スタイルファイル」という項目にダウンロードするべきファイルがありますが,3種類あって違いがよくわかりません。どうやら「訂正版」というところをクリックするらしい。
3. 「訂正版」に入ると「1 スタイルファイルの訂正版」というところにemathcYYMMDD.zipというファイルへのリンクがあるのでクリックしてダウンロード。YYMMDDはそのバージョンの日付のようです。
4. いつも存在するのかどうかわかりませんが,「1' 補訂版」というのがあって同じくzipファイルがダウンロードできます。どうやらこちらは訂正版から修正されたり追加されたファイルのみがはいっているようです。
5. 訂正版のzipファイルを展開。
6. 補訂版のzipファイルを展開して展開されたファイルで訂正版のzipファイルに含まれていたファイルを上書きしてしまいます。
7. 補訂版で上書きしたファイル一式を適当なディレクトリ(たとえば,emathc241011/)に入れて,/usr/local/share/texmf-local/以下にディレクトリごとコピー。
8. cd /usr/local/share/texmf-dist/tex/latex
9. ln -s ../../../texmf-local/emathc241011 emath
10. mktexlsr
とやります。texmf-localの下にemathのパッケージをおいてmktexlsrを走らせてもlatexからパッケージを見つけることができません。かならず8のディレクトリ(/usr/local/share/texmf-dist/tex/latex/)の下にもパッケージを置いてlatexが参照できるようにしておかねばなりません。そのうえで,mktexlsrでファイルのデータベースを更新します。
8と9が必要だということがわかってなくてハマりまくりました。
メタヒューリスティックな最適化アルゴリズム
最近勉強していないので世の中についていけてないのですが,メタヒューリスティックな最適化アルゴリズムをまとめて実装している人がいたのでメモのためにリンクを貼っておこうと思います。
最適化アルゴリズムを実装していくぞ(概要)
2021年頃の記事のようですが,ここに掲載されているアルゴリズムのなかで知らないアルゴリズムの方が多いってのは,己がどんだけ遅れているんだ(勉強していないんだ),ってのがよくわかって悲しくなります。うーむ。
そんだけ...。
最適化アルゴリズムを実装していくぞ(概要)
2021年頃の記事のようですが,ここに掲載されているアルゴリズムのなかで知らないアルゴリズムの方が多いってのは,己がどんだけ遅れているんだ(勉強していないんだ),ってのがよくわかって悲しくなります。うーむ。
そんだけ...。
FreeBSD 13.3Rでアプリケーション&ディスクサーバー(その11;apcupsd)
ディスクサーバーが停電でクラッシュをしたりするとその損害ははかり知れないのでUPSを導入します。これまで,三菱やオムロンのUPSを使ってきましたが,FreeBSDでも普通に連携がとれるAPCが一番便利だというのが私の結論です。そのため,三菱の古いUPSを廃棄してかわりにAPCのBR 1000S-JPを導入しました。OSとUPSの通信はUSBを介して行い,ソフトウェアとしてはapcupsdを使います。USBケーブルはPC側は普通のA端子ですが,UPS側はRJ-45タイプのよくわからんコネクタで,普通にUSB-Bにしておいてくれれば汎用のケーブルが使えるのに専用品をつけてくるところが嫌な感じです。APCは便利だけど昔からそういうせこいところが嫌いでした。
BR 1000Sに接続しているサーバーはディスクサーバーだけではなく,バックアップ用のサーバーなどもつなぐことにします。そのため,電源が失われたことを互いにネットワーク越しに情報共有してshutdownさせなくてはなりません。
ディスクサーバーとUPSを専用のUSBケーブルで接続し,それ以外のサーバーはディスクサーバーを参照するようにします。
いずれのサーバーもpkg install apcupsdでバイナリをインストールすることができます。古いサーバーでは古いOS (FreeBSD 11とか12!)が動いていて,いまさらpkgではインストールできません。FreeBSD 12のサーバーにはgmakeをインストール済みだったので,portsから簡単にインストールできました。
cd /usr/ports/sysutils/apcupsd/
make
make install
オプションがいろいろ表示されますが,デフォルトのままコンパイルしました。
一方,FreeBSD 11のサーバーにはgmakeもインストールしていなかったのでgmakeのインストールからやらねばなりませんでした。
cd /usr/ports/devel/gmake/
make
ここで,portsが古いとか危険だとか言われて止まってしまうのですが,これを回避するために,
make DISABLE_VULNERABILITIES=yes
make install
とやって無理やりインストールします。gmakeがインストールできたら,
cd /usr/ports/sysutils/apcupsd/
make DISABLE_VULNERABILITIES=yes
make install
とやることでapcupsdもインストールできました。良い子はマネをしてはいけません。
USBケーブルで直接UPSと接続しているディスクサーバーでは,/usr/local/etc/apcupsd/apcupsd.confを編集して以下のように設定しました。
## apcupsd.conf v1.1 ##
UPSNAME BR1000S
UPSCABLE usb
UPSTYPE usb
DEVICE
ONBATTERYDELAY 10
BATTERYLEVEL 10
MINUTES 5
TIMEOUT 150
KILLDELAY 600
DEVICEの値をブランクにしておかねばならないようです。電源が失われてから150秒でシャットダウンに入り,600秒でUPS自体の電源を落とす,という設定です。1行目は設定ファイルのバージョンを指定する行でたんなるコメント行ではないようです。この行を省略するとapcupsd起動時に古い設定ファイルっぽいからちゃんと内容を確認しろ,というような警告が表示されます。
ディスクサーバーで動いているapcupsdがマスターとなって,それ以外のサーバーで動くapcupsdはスレーブとして動かします。
## apcupsd.conf v1.1 ##
UPSNAME BR1000S
UPSCABLE ether
UPSTYPE net
DEVICE 192.168.xxx.yyy:3551
ONBATTERYDELAY 10
BATTERYLEVEL 10
MINUTES 5
TIMEOUT 300
KILLDELAY 0
TIMEOUTはサーバーを落とす順番を考えて設定します。DEVICEの値はマスターのIPアドレスです。3551ポートを使うので,DMZとLANの間で通信ができるようにルーターのフィルタ設定を変更して3551が通るようにしておきます。スレーブではKILLDELAYは設定しないので0を書いておきます。
サーバーをshutdownしたときにサーバーの電源が落ちるように,/usr/local/etc/apcupsd/apccontrolを編集します。doshutdown)の後に書かれているshutdownコマンドのオプションが-hになっているのでこれを-pに修正しておきます。
${SHUTDOWN} -p now "apcupsd initiagted shutdown"
というふうにします。
最後に,/etc/rc.confに
apcupsd_enable="YES"
apcupsd_program="/usr/local/sbin/apcupsd"
を追記して,/usr/local/etc/rc.d/apcupsd startとしてapcupsdを起動します。起動したら,apcaccessでステータスを確認できます。USBケーブルでつながっている場合はSTATUS : ONLINEと表示され,ネットワーク越しにつながっている場合は,STATUS : ONLINE SLAVEと表示されます。MAXTIMEの値がTIMEOUTで設定した値になっていればたぶんOKです。
コンセントを引き抜いてちゃんとshutdownするかどうかを確認しなくてはならないのですが,バックアップ作成中なのでそれが終わってから確かめることにします。
BR 1000Sに接続しているサーバーはディスクサーバーだけではなく,バックアップ用のサーバーなどもつなぐことにします。そのため,電源が失われたことを互いにネットワーク越しに情報共有してshutdownさせなくてはなりません。
ディスクサーバーとUPSを専用のUSBケーブルで接続し,それ以外のサーバーはディスクサーバーを参照するようにします。
いずれのサーバーもpkg install apcupsdでバイナリをインストールすることができます。古いサーバーでは古いOS (FreeBSD 11とか12!)が動いていて,いまさらpkgではインストールできません。FreeBSD 12のサーバーにはgmakeをインストール済みだったので,portsから簡単にインストールできました。
cd /usr/ports/sysutils/apcupsd/
make
make install
オプションがいろいろ表示されますが,デフォルトのままコンパイルしました。
一方,FreeBSD 11のサーバーにはgmakeもインストールしていなかったのでgmakeのインストールからやらねばなりませんでした。
cd /usr/ports/devel/gmake/
make
ここで,portsが古いとか危険だとか言われて止まってしまうのですが,これを回避するために,
make DISABLE_VULNERABILITIES=yes
make install
とやって無理やりインストールします。gmakeがインストールできたら,
cd /usr/ports/sysutils/apcupsd/
make DISABLE_VULNERABILITIES=yes
make install
とやることでapcupsdもインストールできました。良い子はマネをしてはいけません。
USBケーブルで直接UPSと接続しているディスクサーバーでは,/usr/local/etc/apcupsd/apcupsd.confを編集して以下のように設定しました。
## apcupsd.conf v1.1 ##
UPSNAME BR1000S
UPSCABLE usb
UPSTYPE usb
DEVICE
ONBATTERYDELAY 10
BATTERYLEVEL 10
MINUTES 5
TIMEOUT 150
KILLDELAY 600
DEVICEの値をブランクにしておかねばならないようです。電源が失われてから150秒でシャットダウンに入り,600秒でUPS自体の電源を落とす,という設定です。1行目は設定ファイルのバージョンを指定する行でたんなるコメント行ではないようです。この行を省略するとapcupsd起動時に古い設定ファイルっぽいからちゃんと内容を確認しろ,というような警告が表示されます。
ディスクサーバーで動いているapcupsdがマスターとなって,それ以外のサーバーで動くapcupsdはスレーブとして動かします。
## apcupsd.conf v1.1 ##
UPSNAME BR1000S
UPSCABLE ether
UPSTYPE net
DEVICE 192.168.xxx.yyy:3551
ONBATTERYDELAY 10
BATTERYLEVEL 10
MINUTES 5
TIMEOUT 300
KILLDELAY 0
TIMEOUTはサーバーを落とす順番を考えて設定します。DEVICEの値はマスターのIPアドレスです。3551ポートを使うので,DMZとLANの間で通信ができるようにルーターのフィルタ設定を変更して3551が通るようにしておきます。スレーブではKILLDELAYは設定しないので0を書いておきます。
サーバーをshutdownしたときにサーバーの電源が落ちるように,/usr/local/etc/apcupsd/apccontrolを編集します。doshutdown)の後に書かれているshutdownコマンドのオプションが-hになっているのでこれを-pに修正しておきます。
${SHUTDOWN} -p now "apcupsd initiagted shutdown"
というふうにします。
最後に,/etc/rc.confに
apcupsd_enable="YES"
apcupsd_program="/usr/local/sbin/apcupsd"
を追記して,/usr/local/etc/rc.d/apcupsd startとしてapcupsdを起動します。起動したら,apcaccessでステータスを確認できます。USBケーブルでつながっている場合はSTATUS : ONLINEと表示され,ネットワーク越しにつながっている場合は,STATUS : ONLINE SLAVEと表示されます。MAXTIMEの値がTIMEOUTで設定した値になっていればたぶんOKです。
コンセントを引き抜いてちゃんとshutdownするかどうかを確認しなくてはならないのですが,バックアップ作成中なのでそれが終わってから確かめることにします。