2018-11-02

pip install --userでインストールしたパッケージをprocmailで使用する

ホームディレクトリにPIPをつかってパッケージをインストールすると、.local/lib/の下に展開される。 ところが、このディレクトリはSELinuxのコンテクストがunconfined_u:object_r:gconf_home_t:s0になっており、問題が生じる。

例えば、ProcmailからPythonを呼び出し、その中でモジュールをインポートしようとすると、以下のようなエラーメッセージが出る。 以下はBeautifulSoupを使用した例。

Traceback (most recent call last):
  File "/tmp/a.py", line 3, in 
    from bs4 import BeautifulSoup
ImportError: cannot import name 'BeautifulSoup'

とりあえず以下のコマンドで問題を回避する。 $ chcon -R unconfined_u:object_r:user_home_t:s0 .local/lib/python3.4/site-packages/

2018-10-28

PKG_CONFIG_PATHを使用したビルド

複数のバージョンのライブラリをインストールしたいなどの場合, バージョンごとにインストール先のディレクトリを分けることがある. その場合に, そのライブラリをリンクして別のソフトをビルドする方法をメモしておく.

ライブラリ (この例ではx264) のビルド・インストールをする. 以下の例では, /usr/local/x264/2018092の下にインストールする設定でビルド・インストールする.

$ mkdir b && cd b
$ ../configure --prefix=/usr/local/x264/20180923
$ make
$ sudo make install

上記のライブラリをリンクするソフト (この例ではffmpeg) のビルド・インストールをする.

$ mkdir b && cd b
$ PKG_CONFIG_PATH=/usr/local/x264/20180923/lib/pkgconfig: ../configure --enable-libx264 --prefix=/usr/local/ffmpeg/4.0.git
$ make
$ sudo make install
例で使用したffmpegでは --extra-cflags--extra-ldflagsというオプションでx264のパスを設定することもできるが, pkg-configを使用したほうが, よりライブラリ開発者の意図した設定でビルドすることができる.

あとは, 以下のようなラッパーを用意しておく.

#! /bin/bash
export LD_LIBRARY_PATH=/usr/local/ffmpeg/4.0.git/lib:/usr/local/x264/20180923/lib:
exec /usr/local/ffmpeg/4.0.git/bin/"$(basename "$0")" "$@"

2018-10-21

EL7にてユーザーのpublic_htmlを公開する手順

Scientific Linux 7 (CentOS 7と同様にRedhat Enterprise Linux 7のクローン, 以下EL7) において, ユーザーのpublic_html下にあるコンテンツをApacheで公開するときの手順をまとめる.

Apacheのインストール

$ sudo yum install httpd

Apache上の設定

$ sudoedit /etc/httpd/conf.d/userdir.conf
以下のように disable の部分をコメントアウトし, 代わりに public_html の箇所を有効にする.
<IfModule mod_userdir.c>
    # UserDir disabled
    UserDir public_html
</IfModule>

SELinuxの設定

$ restorecon -R ~/public_html
$ sudo setsebool -P httpd_enable_homedirs 1
EL7ではデフォルトでhttpd_enable_homedirsが無効に設定されているので, これを有効にする必要がある.

Wirewalldの設定

$ sudo firewall-cmd --add-service=http
これでアクセスできることを確認したのち, 以下のコマンドでパーマネントな設定にする.
$ sudo firewall-cmd --permanent --add-service=http

2018-10-20

新規インストールしたサーバーにSSHの公開鍵認証でログインできない

新しくインストールしたScientific Linux 7 (CentOSと同様にRedhat Enterprise Linuxのクローン) サーバーに公開鍵認証をつかってSSHログインしようとすると, なぜか公開鍵をつかってくれない...

クライアント側のデバッグ情報を ssh -vvv で表示.

  debug1: Offering public key: RSA SHA256:xxxx /home/dir/.ssh/id_rsa
  debug3: send_pubkey_test
  debug3: send packet: type 50
  debug2: we sent a publickey packet, wait for reply
  debug3: receive packet: type 51
  debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
  debug2: we did not send a packet, disable method

サーバー側にデバッグ設定を追加. ファイル

LogLevel DEBUG
サーバー側のログ /var/log/secure
Oct 20 13:37:14 host sshd[xxxx]: debug1: trying public key file /home/xxxx/.ssh/authorized_keys
Oct 20 13:37:14 host sshd[xxxx]: debug1: Could not open authorized keys '/home/xxxx/.ssh/authorized_keys': Permission denied

結局のところ, SELinuxが原因だった. .sshを古いマシンからコピーしたので, 正しくコンテクストが設定されていなかった.

restorecon -R ~/.ssh
これまでは, chmodだけで良かった...
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

2018-10-07

An alternative script for Dropbox

Dropboxが使えなくなるので, 代替のツールを探している. やりたいことは, 自宅サーバ上と別のPCとの間のファイル同期なので, とりあえず, rsyncをcronで実行して, 同期を取ることにした.

以下のようなスクリプトを用意しておき, 各PCでcronから呼び出す.

#! /bin/bash

cd "$(dirname "$0")"

rsync=(rsync -aku --backup --backup-dir .rsync-backup --suffix="-$(date +%Y%m%d-%H%M)" --exclude '*~' --exclude '.*.sw*' --exclude .rsync-backup "$@")

dirs=()
test "$HOSTNAME" != s1.example.com && dirs=("${dirs[@]}" s1.example.com:rsync/)
test "$HOSTNAME" != s2.example.com && dirs=("${dirs[@]}" s2.example.com:rsync/)
# and more servers...

# receiving
for d in "${dirs[@]}"; do
 "${rsync[@]}" "$d"/ ./
done

# sending
for d in "${dirs[@]}"; do
 "${rsync[@]}" ./ "$d"/
done
うーん, ファイルの削除のためにオプション--delをつけると, 新しいファイルが消えてしまう...

なお, 以下のサービスが代替候補.

  • pCloud - Githubにクライアントプログラムが出ていて, ソースからビルドして使用する.
  • Mega
  • Spideroak - 無料ではなくなった???

2018-10-06

自作PC組み立て

概要

1年位前に, OBS-Studioをつかう目的で, 古いPCの部品を入れ替えて, 新しいPCを組み立てた. 今でも問題なく動いているので, そのときに購入した部品を紹介する. なお, 自分用ではない. 使用頻度は, 週に半日くらい.

PCIおよびPCIEのカードでカメラからの映像をキャプチャし配信することが目的. 映像は複数あって, CPU上でスイッチする. 1K程度の映像を処理する. OSには, 安定していると期待してScientific Linux 7を選んだ.

使用部品

以下の部品を新たに購入した.

CPU: Intel Core i7-7700

Memory: Team TED48G2400C16BK

Mother board: Asus H270-Pro
PCI, PCIEのボードをいくつか載せたかったので, これにした.

Display port to VGA変換アダプタ
自分でつかうならHDMIかDisplay Portのモニタを選ぶのだが... 予算の都合でモニタは古いアナログのまま. この種の変換アダプタは故障が心配なので, レビューを注意深く確認した. この製品は未だ故障していない.

Blackmagic Intensity Pro 4K
業務用の製品も出している会社なので, Linuxのサポートも謳っており, OBS-Studioでサポートしていることを確認して, 購入した. Scientific Linux 7へのインストールはとても苦労した. Kernelのアップデートでも, カーネルモジュールのための色々な作業が必要だ.


2018-09-14

GhostScriptを使用したPDFマニピュレーション

GhostScript (GS) を使用すると、PDFの処理をいろいろとできて面白い。

複数のPDFファイルを連結する。

gs -dNOPAUSE -sDEVICE=pdfwrite -dSAFER -sOUTPUTFILE=combined.pdf -dBATCH 1.pdf 2.pdf

ページを選択する。

gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dFirstPage=22 -dLastPage=36 -sOutputFile=output.pdf input.pdf

フォントを埋め込む。

gs -dPDFSETTINGS=/prepress -dEmbedAllFonts=true -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=output.pdf -c .setpdfwrite -f input.pdf

DOCINFOを上書きする。

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=output.pdf input.pdf -c '[/Creator()/Author()/Subject()/Title()/Keywords() /DOCINFO pdfmark'

どこのサイトからコピーしてきたかによって、引数の並びが微妙に異なる。完全には理解できずに使っている...

2018-08-26

日本語の文字数を数える方法

UTF-8になって、全角文字が2バイトでなくなったこともあり、文字数を数えるのが面倒になった。

やや面倒だが、以下のコマンドで、日本語混じりの文字数をカウントできる。

$ python -c 'import sys; print len(sys.stdin.read().decode("utf-8"))'
標準入力からUTF-8のテキストを流し込む。

なお、この方法の場合は、ひらがな・漢字が1文字とカウントされるが、同時に、数字など半角文字も1文字と数えられる。

2018-07-21

GPG: ファイルを共通鍵で暗号化する方法

暗号化
$ gpg -c file
これにより、file.gpgが生成される。
$ file file.gpg
file.gpg: GPG symmetrically encrypted data (AES cipher)

復号化

gpg -d file.gpg
(標準出力へ出力される)

公開鍵暗号と違って、鍵のセットを用意するなどの必要がないので、個人で使う分には便利。

2018-06-07

PulseAudioのpipe-sourceとpipe-sink

PulseAudioのpipe-sinkやpipe-sourceとffmpegとをプロセス間通信する方法のメモ.
pactl load-module module-pipe-sink file=/tmp/sink.fifo
pactl list | less # どのようなサンプリングスペックになっているか確認.
ffmpeg -f s16le -ac 2 -ar 48000 -i /tmp/sink.fifo save.wav
新しくできたシンクに向かってアプリケーションから再生すると, ffmpegによって取り込むことができる.
pactl load-module module-pipe-source file=/tmp/source.fifo
ffmpeg -i input.wav -f s16le -ac 2 -ar 48000 /tmp/source.fifo
新しくできたソースからアプリケーションで録音ができる.

この方法単体では役に立たないが, 独自のソース・シンクを開発する場合に便利だろう. PulseAudioのモジュールを書かなくても, pipeへ読み書きするだけでソース・シンクのディバイスを作ることができる.
ところで, スピーカーへ再生している何かを録音したい場合, sink-monitorっていうsourceから録音すれば良いので, pipe-sinkは必要ない.

2018-05-12

パスワード無しでsudoできるコマンドをsudoersへ設定

通常はsudoを使うとユーザーのパスワードを要求するが, パスワードなしで実行できるように設定することができる. その方法をメモする.

シャットダウンやサスペンドなどのコマンドをsudoを通して呼び出すことがあるが, そのような場合に便利だ.

以下にユーザー名user1のユーザがpm-suspendをパスワードなしで実行できるようにする方法を例示する.

user1 ALL=NOPASSWD: /usr/sbin/pm-suspend

2018-03-10

確定申告の添付書類台紙へ本人確認書類を電磁的に貼り付ける

確定申告書を印刷して提出する時, 源泉徴収票 (原本) とマイナンバーカード (写) を添付書類台紙へ貼る必要がある. わざわざ別の紙に印刷して貼るのは面倒かつ紙の無駄である. pLaTeXを使用して電磁的に貼る方法を説明する.
  • まず, 貼る予定のカードをスキャンし, 大きさをそろえて周囲を切り取る. 各ページをEPSで保存する. 一例としてGimpを使用するとこのような作業ができる.
  • 貼り付け台紙のページをEPSへ変換する.
    $ pdftops -f 2 -l 2 ../h29syotoku.pdf id-format.eps
    もしAcrobat Reader等からEPSを作成したい場合, このページが役に立つかもしれない.
  • pLaTeXのコードを作成し, PDFを作成する.
    platex id && dvipdfmx id
    以下に, TeXのソースコードを示す.
    \documentclass{jarticle}
    \usepackage{wallpaper}
    \usepackage{graphicx}
    \usepackage{geometry}
    \usepackage{color}
    
    \geometry{left=0mm,right=0mm,top=20mm,bottom=20mm}
    
    \begin{document}
    \thispagestyle{empty}
    \ThisCenterWallPaper{1.0}{id-format.eps}
    
    \center \begin{tabular}{c}
      ~\vspace{77mm}~ \\ % 位置を調整する
      \colorbox{white}{
        \begin{tabular}{cc}
          ~ \\
          \includegraphics[width=90mm]{taxid-1.eps} &  % マイナンバー 表
          \includegraphics[width=90mm]{taxid-2.eps} \\ % マイナンバー 裏
          ~ \\
          % 本人確認書類を貼る場合:
          \includegraphics[width=90mm]{lic-1.eps} &
          \includegraphics[width=90mm]{lic-2.eps} \\
          ~ \\
        \end{tabular}
      }
      \\
    \end{tabular}
    \end{document}
    
    width=90mmの箇所は, 周囲を切り取ったときの大きさに合わせて設定する. あるいは, EPSに大きさを正しく設定していれば, widthは不要になる.
  • 2018-01-19

    Postfix+Procmail: 電子メールの添付ファイルを自動で保存する方法

    Linuxメールサーバ上で, 送られて来た電子メールの添付ファイルを自動で保存する方法をメモする.

    Pythonのスクリプトを以下のように用意する.

    #! /bin/env python
    
    import sys
    import email
    import re
    import os
    
    re_fname = re.compile('[^\./][^/]*\.[a-zA-Z0-9]*$') # この箇所は適宜修正をすること.
    dest_dir = '/home/hoge/email/' # 保存先のディレクトリ
    
    msg = email.message_from_string(sys.stdin.read())
    for part in msg.walk():
            fn = part.get_filename()
            if not part.is_multipart() and fn and re_fname.match(fn):
                    print dir(part)
                    fp = open(os.path.join(dest_dir, fn), 'wb')
                    fp.write(part.get_payload(decode=True))
                    fp.close()
    
    上記のスクリプトを ~/Maildir/attach2file.pyという名前で保存した場合, .procmailrcに以下のように記述する.
    :0c
    *^Content-Type: multipart
    | $HOME/Maildir/attach2file.py
    

    なお, re_fnameの箇所は, ..など他のディレクトリへファイルを書き込まれないようにするなどセキュリティに配慮して記載する.

    2018-01-09

    EPSをWMF経由でPowerPointにインポート

    以前に, EPSをPowerPoint 2007にインポートすると失敗することを記事にした. InkscapeでWMFに変換してインポートすることで, ベクターフォーマットを保ってPowerPointにインポートできることが分かった. その方法をメモしておく.
    1. EPSをInkscapeでWMFに変換する.
      inkscape tmp.eps --export-wmf tmp.wmf
      GUIで操作する場合, テキストをパスに変換するかなど, 色々なオプションがある.
    2. PowerPointでtmp.wmfをインポートする.
    3. [グループ化解除] を行うことで, ベクターの図になる.
    上記のステップ1は, 以下のように, 一度SVGを経由しても良い.
    1. EPSをInkscapeのSVGフォーマットへ変換する.
      inkscape tmp.eps -l tmp.svg
      
    2. 必要に応じて, SVGを編集する. 以下の例では, フォントをTimesからsans-serifへ変換する.
      sed \
        -e 's/font-family:Times;/font-family:sans-serif;/g' \
        -e 's/-inkscape-font-specification:Times-/-inkscape-font-specification:sans-serif,/g' \
        -i tmp.svg
      
    3. WMF形式で出力
      inkscape tmp.svg --export-wmf tmp.wmf
      

    私は Inkscape 0.92.2-1.fc26 を使用しているが, 以下の問題が見つかった.

  • 破線が実線になる. (破線の間隔が狭すぎて, 実線に見える.)
  • 網掛けの色が変わる.
  • 枠と塗りつぶしが別々のオブジェクトに分割される. (EPSの仕様?)
  • 白の矩形で消した箇所が現れることがある. (たぶん, 白色の塗りつぶしが消えた.)
  • 矢印が消える