さくらインターネットのメーリングリストFML4で添付ファイル禁止

ちょっと,苦労したのでメモ

さくらインターネットのメーリングリストはfml4を使用している。
このメーリングリストでの設定ファイルは,各メーリングリストごとのconfig.phで行う。

ちなみに,config.phをいじると,コントロールパネルから設定を変更すると上書きされてしまうので注意

% cd ~/fml/spool/ml/メーリングリスト名/

config.phに追記。最後の1;の直上に書く

$USE_DISTRIBUTE_FILTER = 1;
$DISTRIBUTE_FILTER_HOOK .= q#
    if ($e{'Body'} =~ /filename=.*/i) {
        return 'Do not post messages with attachments';
    }
#;

要は,filename属性があったときには拒否するということ

ネットで調べた下記方法では,HTMLメールまでおかしくなってしまうので,NG

&ADD_CONTENT_HANDLER('multipart/.*','text/plain','allow');
&ADD_CONTENT_HANDLER('multipart/.*','text/html','strip');
&ADD_CONTENT_HANDLER('multipart/.*','*./.*','strip');

いろいろ調べてしまった。

LinkstationにDebianを導入し,Timemachineサーバにする

LS-V1.5TLというBuffaloのNASをずいぶん前に買ったのですが,あまり活用ができていなかったので,
Linuxを入れることにしました。

元々のNASのファームウエアにもTimemachineサーバはついているのですが,もう古いマシンなので壊れても
いいという感じでLinux化し遊ぶことに。

Linux化

こちらの記事がわかりやすいです。
一度分解し,HDDを取りだすのが面倒ですが,それさえ終われば,快適なLinux化ができます。
当然のように,分解の際にほぼ全てのつめを折ってしまいましたが気にしない。

timemachine

手順などはあちらこちらに書いているのですが

avahi

ここを参考に,avahiをインストールします。debianのパッケージがあるのでそのまま使います

sudo apt install avahi-daemon

設定はこんな感じ

/etc/avahi/services/timemachine.service




 %h
 
   _smb._tcp
   445
 
 
   _adisk._tcp
   dk0=adVN=TimeMachine,adVF=0x82
 

samba

sambaをインストールします。Samba上で使うみたいです

sudo apt install samba

sambauser

timemachineとユーザを作ります

sudo adduser timemachine
sudo password -a timemachine
sudo smbpasswd timemachine

timemachine directory

バックアップ用ディレクトリを作成します

sudo mkdir /mnt/timemachine
sudo chown -R timemachine:timemachine /mnt/timemachine

smb.conf

ここでポイントは,通常のSambaユーザとは別にし,Finderなどからはいじれないようにします。
同時にアクセスするとエラーになるための回避です。

[TimeMachine]
   path = /mnt/timemachine
   browsable = yes
   writeable = yes
   create mode = 0664     #tried turning this off, no fix
   directory mode = 0777  #tried turning this off, no fix
   vfs objects = catia fruit streams_xattr
   fruit:aapl = yes
   fruit:time machine = yes
   #guest ok = yes
   fruit:time machine max size =1T  #tried turning this off, no fix
   inherit acls = yes

restart

リスタートします

sudo /etc/init.d/smbd restart
sudo /etc/init.d/avahi-daemon restart

これで使えると思います。

Mac OS 11.4でpip pdftotext

M1Macで何故か素直に入らなかったのでメモ

環境

  • M1 Mac book Air
  • OS: 11.4
  • python: Intel miniconda3
  • python version:3.8.5

手順

brewでPdftotextを入れる

brew install pdftotext

~/.zshrcに追加

export C_INCLUDE_PATH=/opt/homebrew/Cellar/poppler/21.05.0/include:$C_INCLUDE_PATH
export CPATH=$C_INCLUDE_PATH
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/opt/homebrew/Cellar/poppler/21.05.0/lib # どうもこれは効かないらしい

pipでpdftotextライブラリを入れる 

pip install pdftotext --global-option=build_ext --global-option="-L/opt/homebrew/Cellar/poppler/21.05.0/lib"

M1 MacでのPython

M1 Mac book Air 購入したのですが,なかなか使いこなすにはハードルが高そうです。
特に,Pythonのモジュール類がうまく動かないものが多いです。

いろいろ書かれていますが,結論としては,Rosetta2を使うのが一番という結論。

brewのPythonを使うパターン

これは,ディープラーニング系のライブラリが全く入りません。
自分でGitHubからソースコード持ってきてインストールできるものもあるのですが
かなり厳しいです。

pyenvを使うパターン

brewと同様

miniforgeを使うパターン

これはarm用のライブラリもあるのですが,全部はない模様。。

rosetta2でminiconda

これが簡単ですね

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh -O ~/miniconda.sh
./miniconda.sh

これでIntelと同様に使えます。多少遅くなっているのでしょうが気にしない

vimでJSONのフォーマット

大きく分けてふた通りあるみたいだ。

jqを使うパターン

ubuntuの場合

apt install jq

macの場合

brew install jq

外部コマンドとして,VIMから起動する

:%!jq

pythonを使うパターン

こちらはpythonが入っていればvimから

:%!python -m json.tool

どうもvimrcで自動フォーマットする方法は見つからなかった?

beep音削除

microsoft terminalからubuntuへsshログインしたとき、BEEP音がうるさいのを削除する設定

csh

~/.cshrcに以下を追加

set nobeep

bash

~/.inputrcに以下を追加

set bell-style none

vim

~/.vimrcに以下を追加

set vb t_vb=

VSCodeのjupyter notebookが起動しない

最近VSCodeをアップデートしたところ、PythonのNotebookが起動しなくなりました。

Connection To IPython kernel: Connecting to kernel.

これでずーと待ったのちに、タイムアウト。

こちらに解決方法が!!

どうやら、Pythonのモジュールと干渉しているようですので、バージョンダウン。

python -m pip install 'traitlets==4.3.3' --force-reinstall

これで無事起動できました。

MacのRStanのインストールエラー

メモ

環境

  • MacOS 10.15.4
  • R 3.6.3

エラー

install.package("rstan")

こんなえらー

unistd.h:727:31: error: unknown type name 'uuid_t'; did you mean 'uid_t'?

対策

RからこれでOK

install.packages("Rcpp", repos="https://RcppCore.github.io/drat")

VSCodeでLatex

MacのVSCodeでLatexを使うためのセッティングの備忘録

環境

  • Mac OS 10.15
  • texlive 2019

settings.json

いろいろなところを参照し、最終的にこれ


{
    "latex-workshop.latex.tools": [
        {
            "name": "latexmk",
            "command": "latexmk",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-outdir=%OUTDIR%",
                "%DOC%"
            ],
            "env": {}
        }
    ],

    "latex-workshop.latex.outDir": "%DIR%",
    "latex-workshop.view.pdf.viewer": "tab",
    "latex-workshop.view.pdf.zoom": "page-width",
}


$HOME/.latexmkrc

#!/usr/bin/env perl
$latex            = 'platex -synctex=1 -halt-on-error';
$latex_silent     = 'platex -synctex=1 -halt-on-error -interaction=batchmode';
$bibtex           = 'pbibtex -kanji=utf8';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';
$max_repeat       = 5;
$pdf_mode         = 3; # 0: none, 1: pdflatex, 2: ps2pdf, 3: dvipdfmx
$aux_dir          = ".";
$out_dir          = ".";

実験

人工知能学会全国大会のテンプレートをダウンロードし、jsaiac.styとjsai.bstを同じディレクトリに入れておく

\documentclass[twocolumn]{ujarticle}
\usepackage{jsaiac}

\begin{document}
ああああ

\end{document}

このファイルを作成し保存するとコンパイルが始まり、PDFが作成される

KLDivergenceとJSDivergence

Pythonのコード作成したのでメモ

KLダイバージェンス

$$D_{KL}(P||Q) = \sum_x p(x) \, \log \frac{P(x)}{Q(x)}$$

JSダイバージェンス

$$D_{JS}(P||Q)=\frac{1}{2}\bigg\{ D_{KL}(P \, || \, R)+D_{KL}(Q \, || \, R) \bigg\}$$
$$R = \frac{P + Q}{2}$$

プログラム

ここを参考に

データ

まずはデータの準備


import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

np.random.seed(12345)
a=np.random.normal(40,10, size=200)
b=np.random.normal(70,15, size=100)
c=np.random.normal(30,2, size=70)
d=np.random.normal(150,10, size=150)

plt.figure()
plt.hist(a,alpha=0.3,bins=20,histtype="stepfilled",color="r",label="a")
plt.hist(b,alpha=0.3,bins=20,histtype="stepfilled",color="b",label="b")
plt.hist(c,alpha=0.3,bins=20,histtype="stepfilled",color="black",label="c")
plt.hist(d,alpha=0.3,bins=20,histtype="stepfilled",color="y",label="d")
plt.legend()
plt.show()

ヒストグラム

KLダイバージェンス


def KLDivergence(a, b, bins=20, epsilon=.00001):
    min_value=min(min(a),min(b))
    max_value=max(max(a),max(b))
    # サンプルをヒストグラムに, 共に同じ数のビンで区切る
    a_hist, _ = np.histogram(a, range=(min_value,max_value),bins=bins) 
    b_hist, _ = np.histogram(b, range=(min_value,max_value),bins=bins)
    
    # 合計を1にするために全合計で割る
    a_hist = (a_hist+epsilon)/np.sum(a_hist)
    b_hist = (b_hist+epsilon)/np.sum(b_hist)
    
    # 本来なら a の分布に0が含まれているなら0, bの分布に0が含まれているなら inf にする
    return np.sum([ai * np.log(ai / bi) for ai, bi in zip(a_hist, b_hist)])

JSダイバージェンス


def JSDivergence(a, b, bins=20, epsilon=.00001):
    min_value=min(min(a),min(b))
    max_value=max(max(a),max(b))
    # サンプルをヒストグラムに, 共に同じ数のビンで区切る
    a_hist, _ = np.histogram(a, range=(min_value,max_value),bins=bins) 
    b_hist, _ = np.histogram(b, range=(min_value,max_value),bins=bins)

    # 合計を1にするために全合計で割る
    a_hist = (a_hist+epsilon)/np.sum(a_hist)
    b_hist = (b_hist+epsilon)/np.sum(b_hist)
    
    r_hist = (a_hist + b_hist)/2.0
    
    ar= np.sum([ai * np.log(ai / ri) for ai, ri in zip(a_hist, r_hist)])
    br= np.sum([bi * np.log(bi / ri) for bi, ri in zip(b_hist, r_hist)])
    return (ar+br)/2.0

実験

まずはaとbの分布を調べます。


kl1=KLDivergence(a,b)
js1=JSDivergence(a,b)

kl2=KLDivergence(b,a)
js2=JSDivergence(b,a)
print("kl1=",kl1,",kl2=",kl2)
print("js1=",js1,",js2=",js2)

kl1= 4.804620164702722 ,kl2= 8.66117091460137
js1= 0.44568757334874426 ,js2= 0.44568757334874426

KLダイバージェンスはaとbを入れ替えると値が変わりますが、JSダイバージェンスでは同じです。

つぎに、分布間でのKLダイバージェンスとJSダイバージェンスの値を調べます


# 一致 
kl1=KLDivergence(a,a)
kl2=KLDivergence(a,a)
js=JSDivergence(a,a)
print("一致:kl1=",kl1,",kl2=",kl2,",js=",js)

# 含まれる
kl1=KLDivergence(a,c)
kl2=KLDivergence(c,a)
js=JSDivergence(a,c)
print("含有:kl1=",kl1,",kl2=",kl2,",js=",js)

# 重なる
kl1=KLDivergence(a,b)
kl2=KLDivergence(b,a)
js=JSDivergence(a,b)
print("重複:kl1=",kl1,",kl2=",kl2,",js=",js)

# 小別離
kl1=KLDivergence(b,d)
kl2=KLDivergence(d,b)
js=JSDivergence(b,d)
print("小離:kl1=",kl1,",kl2=",kl2,",js=",js)

# 大別離
kl1=KLDivergence(a,d)
kl2=KLDivergence(d,a)
js=JSDivergence(a,d)
print("大離:kl1=",kl1,",kl2=",kl2,",js=",js)

一致:kl1= 0.0 ,kl2= 0.0 ,js= 0.0
含有:kl1= 8.982185089568121 ,kl2= 1.5818474236167488 ,js= 0.3961382475750016
重複:kl1= 4.804620164702722 ,kl2= 8.66117091460137 ,js= 0.44568757334874426
小離:kl1= 14.585645733703917 ,kl2= 14.484008742932685 ,js= 0.6931379306807828
大離:kl1= 14.9325435215302 ,kl2= 15.170878470071264 ,js= 0.6931412821202988

結果を見ると、距離の遠い順にKLダイバージェンス、JSダイバージェンスの値が大きくなっています。KLダイバージェンスの場合には、どちらを基準にするかによって変わってくるので注意が必要みたいですね。