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の仕様?)
  • 白の矩形で消した箇所が現れることがある. (たぶん, 白色の塗りつぶしが消えた.)
  • 矢印が消える