カテゴリー
PC

bsfilterの「invalid byte sequence in EUC-JP」を回避する

bsfilterでメールを処理していると、以下のようなエラーが出るときがあります。

/path/bsfilter:1371:in `gsub': invalid byte sequence in EUC-JP (ArgumentError)
	from /path/bsfilter:1371:in `decode_character_reference'
	from /path/bsfilter:1590:in `tokenize_body'
	from /path/bsfilter:1303:in `tokenize_buf'
	from /path/bsfilter:2799:in `block (2 levels) in do_imap'
	from /path/bsfilter:2796:in `each'
	from /path/bsfilter:2796:in `block in do_imap'
	from /path/bsfilter:2794:in `each'
	from /path/bsfilter:2794:in `do_imap'
	from /path/bsfilter:3442:in `run'
	from /path/bsfilter:3494:in `<main>'

これを回避するには、Ruby2.1.0以降では、decode_character_refrence()関数の冒頭を以下のようにします。

  def decode_character_reference(str, lang)
    if (@options["utf-8"])
      newstr2 = str.scrub('?') # この行を追加。下の行のstrをnewstr2に変更
      newstr = newstr2.gsub(/\&\#(\d{1,5}|x[\da-f]{1,4});/i) do
カテゴリー
PC

PDFの「右綴じ、見開きページ(表紙)」を自動化する

自炊した画像データが入ったPDFを、以下のようにしたいことがあると思います。

  • ビューアで開いた時に、見開き表示にする
  • その際、表紙だけは独立したページで表示する
  • またその際、右綴じとして表示する

Acrobatで開いて「プロパティ」から操作しても良いのですが、数が多いと面倒くさいですし、自動化したい需要もあると思います。そんな時に、自動化する方法を以下に示します。

方法

perlと「PDF::API2」モジュールを使います。

use PDF::API2;
use PDF::API2::Basic::PDF::Utils;

$filename = $ARGV[0];
$newfilename = $ARGV[1];

$pdf = PDF::API2->open($filename);
$newpdf = PDF::API2->new(-file => $newfilename);

$newpdf->preferences(-righttoleft => 1);

$newpdf->{'catalog'}->{'PageLayout'} = PDFName('TwoPageRight');

$pagenumber = $pdf->pages;

for ($i=1; $i<=$pagenumber; $i++) {
    $newpdf->importpage($pdf, $i);
}

$newpdf->update;

10行目で、閉じ方向を右綴じにします。
12行目で、Acrobatでいうところの「ページレイアウト」を「見開きページ(表紙)」に設定します。

PDFの仕様

「右綴じ」にするには、CatalogのViewerPreferencesにDirectionとしてR2Lを指定します。(PDF 1.2以上)

ページレイアウトを「見開きページ(表紙)」にするには、CatalogにTwoPageRightを指定します。(PDF 1.5以上)

PageLayoutと綴じ方向の関係は、以下のようになります。

  • TwoColumnLeft: 「連続見開きページ」に相当。左綴じでは「12」「34」という表示。右綴じでは「21」「43」という表示。
  • TwoColumnRight: 「連続見開きページ(表紙)」に相当。左綴じでは「1」「23」「45」という表示。右綴じでは「1」「32」「54」という表示。
  • TwoPageLeft: 「見開きページ」に相当。TwoColumnLeftと同じ表示で、連続表示しない(1画面では1見開きのみ表示する)。
  • TwoPageRight: 「見開きページ(表紙)」に相当。TwoColumnRightと同じ表示で、連続表示しない。

PDF::API2の使い方

R2Lを指定するには、preferencesに「-righttoleft=>1」を指定します(10行目)。ドキュメントには書いていませんが、ソースでは実装されています。

TwoPageLeft, TwoPageRightを指定する機能はありません。ので、PDF::API2のソースを見て、TwoColumnLeftの指定方法をまねて、同じ方法で指定します(12行目)。

参考文献

カテゴリー
PC

chinachuのログをFluentdを使って監視する

Chinachuのログを、Fluentdを使って監視する設定が書けたので、ご報告します。

Chinachuのログは、放っておくと重要なログが埋もれてしまいます。重要なログのみを別ファイルに出力するように、Fluentdを設定します。

<source>
  @type tail
  tag chinachu.operator
  path /path/to/chinachu/log/operator
  pos_file /var/log/td-agent/chinachu.operator.pos
  format /^(?<time>[^-]*) - (\[\d+\] )?(?<kind>[A-Z]+)?(?<reccmd>#[^:]+)?: (?<contents>.*)$/
</source>

<source>
  @type tail
  tag chinachu.scheduler
  path /path/to/chinachu/log/scheduler
  pos_file /var/log/td-agent/chinachu.scheduler.pos
  format /^(?<time>[^-]*) - (\[\d+\] )?(?<kind>[A-Z]+)?(?<reccmd>#[^:]+)?: (?<contents>.*)$/
</source>

<filter chinachu.*>
  @type grep
  regexp1 kind FATAL|ERROR|WARNING
</filter>

<match chinachu.*>
  @type file
  path /var/log/chinachu
  append true
</match>

4行目、12行目は、chinachuのログファイルへのパスに適宜書き換えて下さい。

1-7行目、9-15行目で、operatorとschedulerのログを入力します。
その際、ログをパースして、時間・種類・ログ内容に切り分けています。

17-20行目では、取得したログのうち、どのログをoutput pluginに渡すかを決めています。
この例では、kindがFATAL,ERROR,WARNINGのログを渡すようにしています。

22行目以降で、ログを実際にファイルに出力します。
ここはお好きにどうぞ。

これで、指定された種類のログだけが別ファイルに出力されるようになります。

カテゴリー
PC

perlでwhile-eachは使わない方がいい

録画ファイルを自動的に移動したりscpしたりするプログラムを書いてて、ハマったのでその話。

カテゴリー
アイスホッケー

平昌五輪・アイスホッケー男子・二次予選に行ってきました(その5・終)

オリンピック予選の話の最終回です。