やるきなし

2020/10/02 17:29 / GNU Mailman で送付されてきたメールに対する MHonArc+Namazu システム構築

MHonArc+Namazu での Namazu の UTF-8 対応の続き.MLシステムが刷新されて FML から GNU Mailman に変更になったため対応.

FML はメールのヘッダに X-Mail-Count というフィールドがあって,ここに何件目の投稿かの番号が振られていたのだが,GNU Mailman に変更されてこのフィールドを参照できなくなった.GNU Mailman 側で対応してもらう手もあるが(https://shugo.net/jit/20100213.html等),これは期待できないので,幸い Subject の形式が [ML-Name:Count] Mail Subject だったので,ここから抽出する.mhamain.pl への追加パッチ以下.抽出に失敗したときのことはやるきがないので知らない.あと perl っぽい書き方もよく分かっていないので ruby っぽい書き方になってる.

--- a/perl/mhamain.pl
+++ b/perl/mhamain.pl
@@ -932,7 +932,13 @@ sub read_mail_header {
     ##------------------##
     if (defined($SEQNUMFIELD)) {
         $seq = $fields->{$SEQNUMFIELD}[0];
-        $seq =~ s/(\d+)/$1/;
+        if ($seq =~ /^(\d+)$/) {
+            $seq=$1;
+        } elsif ($seq =~ /^\[\S+?:(\d+)\].*$/) {
+            $seq=$1;
+        } else {
+           $seq='';
+       }
         print STDOUT "($seq)";
     }
     ##------------------##

ついでに...MHonArc は URL をリンクに変換してくれるのだが,URL 末尾に全角スペースがあると,それも URL の一部だと解釈される.ということで URL 末尾に %E3%80%80 がついたベージに飛ばされる.ぴえんだ.これを修正するパッチは以下.こちらもやるきなし.変に表示が詰まるのを避けるため,末尾に全角スペースがあった場合は</a>の後にスペースを入れることにしている.

--- a/perl/mhtxtplain.pl
+++ b/perl/mhtxtplain.pl
@@ -574,8 +574,15 @@ sub filter {
        ($HUrlExp)
    }{
        if (!defined($nolink) && !defined($link)) {
+                my $a = $1;
+                my $b = '';
+                $a =~ s/ +$/ /;
+                if ($a =~ /^(.*) +$/) {
+                    $a = $1;
+                    $b = ' ';
+                }
        join('', '<a ', $target, ' rel="nofollow" href="',
-            $1, '">', $1, '</a>');
+            $a, '">', $a, '</a>', $b);
        } else {
        my $url_match = $1;
        my $scheme;

Related articles

2020/09/27 18:10 / xls(x) to csv using libreoffice

いつも忘れるのでメモ.以下で input.xlsxinput.csv に変換できる.環境は Debian GNU/Linux の libreoffice package.

% libreoffice --headless --convert-to csv:"Text - txt - csv (StarCalc)":44,34,76 --outdir . input.xlsx

44,34,76 の意味は

% libreoffice --headless --convert-to csv:"Text - txt - csv (StarCalc)" --outdir . input.xlsx

のように Default でも input.csv は生成されるが日本語が全て ? になってしまう.ということで Character Set の指定が必要で,3つの Token を与える.詳細は https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options のとおり.

2020/09/15 17:56 / 256-bit AES encrypted PDF file

PDFがメールで送られてきていて,パスワードも知らされていたのだが Evince で開けない(伝えられたパスワードが微妙に間違っているのではないかと思い script で結構な数のパスワードを試してしまった...).

調べたところ 256-bit AES (Acrobat X or later) で暗号化されていて,未対応で開けない様子だった.

256-bit AES (Acrobat X or later)

手元の環境でいろいろ調べたところ Debian buster だと尽く未対応の様子.Debian sid でも pdftk が未対応(その代わり qpdf という program がある).google-chrome がもっとも汎用性が高いのかも知れない.

以下,qpdf および pdftk で decrypt するコマンドメモ.

% qpdf --decrypt --password=XXXX encrypted_file.pdf output_file.pdf
% pdftk encrypted_file.pdf input_pw XXXX output output_file.pdf

2020/09/11 20:24 / Linux 5.9-rc4

Linux 5.9-rc1 がでたので(既に rc4 になってるけど),5.8.8 から .configがどう変更されるのか見てみた.以下 - は削除されたもの,+ は追加されたもの.x86_64.New features 等は https://www.phoronix.com/scan.php?page=article&item=linux-59-features 参照.

追加

削除

Related articles

2020/09/11 19:13 / /dev/md126 が Linux 5.8.8 で認識されない

Kernel を Linux 5.7.X から Linux 5.8.8 に上げたら /dev/md126/dev/md127 が見えなくなった.Kernel の問題なのか,udev の問題なのか,あるいは mdadm の問題か,という感じで順番に探っていったのだけど,Kernel と mdadm の問題だった.

Linux 5.8.8 の block: fix locking in bdev_del_partition の修正で,BLKPG_DEL_PARTITION ioctl の仕様が微妙に変更になっていて,mdadm がこの ioctl を使ってブロックデバイスが partition か否かをチェックしていて,そこで挙動がおかしくなっていた.

mdadm の該当箇所 util.cは以下のとおりで,errnoENXIOENOTTY の場合は partition ではないと判断している.Linux 5.7.19 では partition ではない場合 ENXIO (No such device or address)が返される.これが,Linux 5.8.8 では ENOMEM (Cannot allocate memory)が返される.うーん.

int test_partition(int fd)
{
    /* Check if fd is a whole-disk or a partition.
     * BLKPG will return EINVAL on a partition, and BLKPG_DEL_PARTITION
     * will return ENXIO on an invalid partition number.
     */
    struct blkpg_ioctl_arg a;
    struct blkpg_partition p;
    a.op = BLKPG_DEL_PARTITION;
    a.data = (void*)&p;
    a.datalen = sizeof(p);
    a.flags = 0;
    memset(a.data, 0, a.datalen);
    p.pno = 1<<30;
    if (ioctl(fd, BLKPG, &a) == 0)
        /* Very unlikely, but not a partition */
        return 0;
    if (errno == ENXIO || errno == ENOTTY)
        /* not a partition */
        return 0;

    return 1;
}

sudo mdadm --detail-platform は 5.7.19 と 5.8.8 で出力は同じ.一方 sudo mdadm --examine /dev/sda (sda は RAID メンバの1つ)の出力が両者で異なっていたので,そこから探っていって問題箇所を見つけた.

Linux 5.7.19 での sudo mdadm --examine /dev/sda は以下で,

/dev/sda:
          Magic : Intel Raid ISM Cfg Sig.
        Version : 1.3.00
    Orig Family : 231b061f
         Family : 231b061f
     Generation : 00e7c753
     Attributes : All supported
           UUID : (snip)
       Checksum : (snip)
    MPB Sectors : 2
          Disks : 4
   RAID Devices : 1

  Disk01 Serial : (snip)
          State : active
             Id : 00000001
    Usable Size : (snip)

[Volume0]:
           UUID : (snip)
     RAID Level : 5
        Members : 4
          Slots : [UUUU]
(snip)

Linux 5.8.8 の sudo mdadm --examine /dev/sda は以下.

/dev/sda:
   MBR Magic : aa55
Partition[0] :   (snip) sectors at            1 (type ee)

ということで,mdadm 側に以下のパッチをあてると解決する.

--- mdadm-4.1/util.c    2018-10-02 03:26:06.000000000 +0900
+++ mdadm-4.1/util.c    2020-09-11 18:59:17.924356095 +0900
@@ -524,7 +524,7 @@
    if (ioctl(fd, BLKPG, &a) == 0)
        /* Very unlikely, but not a partition */
        return 0;
-   if (errno == ENXIO || errno == ENOTTY)
+   if (errno == ENXIO || errno == ENOTTY || errno == ENOMEM)
        /* not a partition */
        return 0;
 

手元環境 Debian なので上記 patch をあてた mdadm のパッケージを作って,dpkg -i で突っ込んで,mdadminitrd にも含まれることになるので initrd が更新されていなければ sudo update-initramfs -k all -u で作り直す.

追記 (2020/9/18)

ENOMEM が返される問題,Linux 5.8.10 で仕様がもとにもどされて(block: restore a specific error code in bdev_del_partition),今は ENXIO を返すようになっている.

Related articles