2012/02/21(火)perl で PDF ファイルのサムネイルを表示

最近、画像加工を扱う案件があり、その案件をこなす上で嵌った内容が・・・orz

perl にて「PDF文書の1ページをサムネイルのように表示させたい」という場合、そのままでは出来ないため、ImageMagick本体、Image::Magick、Ghostscript 、vflib といったようなものを使い、PDF 文書の特>定のページを png か jpeg に変換してブラウザに出力するような CGI を使うことになります。

Image::Magick は Perl モジュールですが、ImageMagick を構築する際、 --with-perl オプションをつけると、一緒にインストールされます。

また、PDF 文書から jpeg や png に変換する際は、Ghostscript と vflib を予めインストールし、ImageMagick を構築する際に

 --with-gslib
 --with-gs-font-dir=/usr/local/share/ghostscript/fonts

を追加すると確実です。

こうして
use Image::Magick
my $pdffile = "sample.pdf[0]" ; # [0] で最初のページという意味になる。
my $tmbfile = "sample.png" ;
my $image_width = 500 ;  # 横幅をpx 数 で。縦は同じ比で拡縮する。
my $pdfobj = Image::Magick->new ;

$pdfobj->Read($pdffile) ;
$pdfobj->Transform(geometry => $image_width) ;
$pdfobj->Write('png:' . $tmbfile) ;


のようにすると出来るはずだが・・・
実際には何も表示されず、サーバのエラーログに
gs: command not found
が出る始末。
どうも /usr/bin/gs へアクセスしようとして、その実体は FreeBSD のポリシー的な内容からして、 /usr/local/bin/gs にあるのが原因らしい。

おそらく、構築時か実行環境の問題なのだろうが、root になって、
# cd /usr/bin
# ln -s /usr/local/bin/gs

とすると、回避する。
すっきりしませんが、これで稼動できたのでとりあえずこのまま。

2012/02/04(土)Apache 普及の功績者が逝去・・・

2017/10/12 4:50 雑多なトピック
知らんかった。。
新聞社だと一定期間経過後記事が消えることが多く、それが嫌なので、無許可転載ご容赦ください。

#でも、新聞社の方から「消せ」と言われたら消さないといけません。
#予めご了承ください。

直接会話や対話をしたことはありませんが、技術系のML Apache-ML の運営などされていましたので、ご存知の方々は多いと思います。筆者もその一人です。

高知新聞 訃報 2012/01/16 より

高知大名誉教授 菊地 時夫氏死去
2012年01月16日08時00分

 菊地 時夫氏(きくち・ときお=高知大名誉教授)14日午後10時16分、肺がんのため高知市内の病院で死去、61歳。埼玉県出身。自宅は高知市曙町1丁目17の8。葬儀・告別式は18日午前10時から同 11時まで、高知市朝倉丙486の1のベルモニー会館朝倉で無宗教。喪主は妻るみ子(るみこ)さん。

2012/02/02(木)本格的に寒い



ここ10年以上、最低気温が -10℃ を記録する日は、シーズン中、数日程度だったのに、今シーズンは連日この有様。

マスゴミ等で発表される気温は、札幌の場合は、都心に程近い札幌管区気象台でのものなので、他の地域より気温は高めになります。

ですから、それを鵜呑みにされてはちょっと困る面もあるわけです。
昨日は「最高気温」が当観測ポイントでは -7.6℃でした。ちなみに最低気温は -12.2℃.

この寒さは、しばらく継続するようなので、今度の週末から始まる雪まつりの雪像や氷像にとってはあまり心配の無い状況です。

2012/01/13(金)FreeBSD 9.0R リリース

2017/10/12 4:48 サーバ運営・管理
本日の朝、アナウンスされました。
欧米圏では特に不吉とされる「13日の金曜日」なんですが、気にしないのかな :-)
例によって、いつもの機械翻訳+意訳を・・・

- 新しいインストーラーに bsdinstall(8) が加えられており、本リリースの一部として提供されるISOイメージによって使用されるインストーラーです。
- Fast Filesystem は、softupdates ジャーナリングをサポートしました。
- ZFS を Version 28 に更新しました。
- 最新の ATA/SATAドライバは、AHCIをサポートし、最新のCAMフレームワークへ移動しました。
- Highly Available Storage (HAST) フレームワークの導入をしました。
- カーネルは、Capsicum Capability Mode (サンドボックス環境提供を主な特徴とする) をサポートしました。
- ユーザレベルでの D-Trace を導入しました。
- TCP/IPスタックは、プラグ接続できる輻輳制御フレームワークおよび、利用可能な5つの輻輳制御アルゴリズム機構ををサポートしました。
- NFSサブシステムを更新し、NFSv3,NFSv2 に加えて、新たに NFSv4 をサポートしました。
- High Performance SSH (HPN-SSH) を導入しました。
- Flattened device tree (FDT) を埋め込み、FreeBSD コンフィギュレーションが単純になりました。
- powerpcアーキテクチャは、Sony Playstation 3 を サポートしました。
- LLVMコンパイラおよび clang を組入れました。
- Gnome version 2.32.1, KDE version 4.7.3 になりました。

今回は、DVD,CD-ROM,bootonly の ISO イメージに加えて、USBメモリから BOOT可能な機器向けに memstick バイナリイメージも提供されているようです。

また、リリースノートを見る限りでは、em(4) [Intel NIC関係]、re(4) [蟹マーク NIC関係]なども更新されているようです。 re(4) では新たに RTL8168E/8111E-VL/RTL8401E がサポートされています。

FreeBSD9 の運用環境への導入は、弊社では、3月中旬頃になりそうです。

2012/01/02(月)FreeBSD 9 より導入される bsdinstall の概要

2017/10/12 4:47 雑多なトピック
FreeBSD 9 のリリースは、年越しをしてしまいましたが、RC3 から2週間以上経過しているので、そろそろか、というところです。

さて、今回はインストーラが置き換わるので、果たしてどの程度変わるのか気になるところです。いろいろ見ていたら、既に概要が出ています。

インストーラの概要はこちら → New FreeBSD Installer test and walkthrough

インストーラの具体的な説明 → FreeBSD ハンドブック-Chapter 3 FreeBSD 9.x 以降のシステムへのインス トール (日本語訳です)

これだけだと、すんなりいけそうなのですが、MLなど眺めていると、Ports に収録されているブートローダには、使えないものがあるという報告も挙がっています。

同じPC上にて Windows と切り替えて FreeBSD を使用する場合、ハードディスクパーティションレイアウトの記録形式が異なるため、注意する必要がありそうです。



具体的には FreeBSD9 から GPT 形式と呼ばれるものに変わるようですが、Windows XP,Vista といったあたりは、GPT 形式に対応しておらず、旧来の MBR 形式なので、手動設定で MBR 形式にする必要があるようです 。

弊社には、そのような使い方をするPCはありませんので、さしあたり大きな問題にはならないですが、Windows 等と切り替えて使うような場合には、注意しないと、インストールで嵌るかもしれません。

2011/12/30(金)配布元の munin 1.4.6 は、FreeBSD8.x のLANトラフィック監視にはそのまま使えない

2017/10/12 4:46 サーバ運営・管理
システムの大幅な改変に伴い、サーバ監視に使用している munin も 1.2.6 から 1.4.6 に更新しました。
ところが、パッチをいろいろ入れていたのを忘れていて、更新だけしてしまったものだから、嵌ってしまったのです・・・orz しかも、まる2日間。。

具体的には、LAN カードのトラフィック計測が全く駄目。
具体的には以下 ↓


この計測を行うプラグインは、 [MUNINBASE]/lib/plugins ディレクトリの中の if_ というスクリプトです。
どうやら、スクリプト内で netstat コマンドを実行して、送信バイト数、受信バイト数を、sed で切り出している仕組みのようです。

手動で netstat コマンドを実行してみて、スクリプトが意図している内容と、実際の netstat コマンドの出力が異なることが分かりました。
具体的には、
72行目:
  rsum += $7; osum += $10;

→ rsum += $8; osum += $11;

87行目と88行目:
  print "rbytes.value", $7;
  print "obytes.value", $10;

→  print "rbytes.value", $8;
  print "obytes.value", $11;

のように修正すると、機能するようになります。

修正後はこんな感じ ↓

#年末・年始でアクセスが少なく静かです :-)

ここまでやって気づいたのですが、FreeBSD の Ports に munin が収録されているようで、Portsでは、この類のパッチが当てられているのかどうか気になったので確認してみました。、
うーーむ。既に対応されとる。最初からこっち見てれば早かったなorz
こんな感じです:
--- plugins/node.d.freebsd/if_.in.orig  2009-12-30 13:55:55.000000000 +0100
+++ plugins/node.d.freebsd/if_.in 2010-02-24 18:59:15.670282185 +0100
@@ -81,9 +81,12 @@
if (NF == 10) {
print "rbytes.value", $6;
print "obytes.value", $9;
- } else {
+ } else if (NF == 11) {
print "rbytes.value", $7;
print "obytes.value", $10;
+ } else {
+ print "rbytes.value", $8;
+ print "obytes.value", $11;

}'
fi

#表示が崩れるので、中括弧は全角文字にしています。実際は半角文字の中括弧です。

--- plugins/node.d.freebsd/if_errcoll_.in.orig  2009-12-30 13:55:55.000000000 +0100
+++ plugins/node.d.freebsd/if_errcoll_.in 2010-02-24 19:00:26.026407278 +0100
@@ -59,9 +59,13 @@
print "ierrors.value", $5;
print "oerrors.value", $8;
print "collisions.value", $10;
- } else {
+ } else if (NF == 11) {
print "ierrors.value", $6;
print "oerrors.value", $9;
print "collisions.value", $11;
+ } else {
+ print "ierrors.value", $6;
+ print "oerrors.value", $10;
+ print "collisions.value", $12;

}}'

#表示が崩れるので、中括弧は全角文字にしています。実際は半角文字の中括弧です。

他にも、幾つかのプラグインにて FreeBSD用のパッチがあるようです。

2011/12/22(木)CPUの消費電力低減法

2017/10/12 4:45 サーバ運営・管理
FreeBSD には、powerd という、省電力ソフトウェアが標準で最初から入っています。
これは、負荷が少ない時にCPUクロックを自動調整で下げ、性能を可能な限り維持しつつCPUの消費電力を下げるものです。

設定は簡単です:
/etc/rc.conf に
 powerd_enable="YES"

を追加するだけです。設定後は、再起動が一番手っ取り早いでしょう。

CPUのクロックは、お使いのマシンにて、
 % sysctl -a dev.cpu.0.freq

とすると、MHz 単位で表示できます。
ちなみに弊社サーバの3台に対して導入すると・・・

2600 → 150  (約17分の1)
2400 → 1000 (約5分の2)
900 → 450  (ちょうど半分)

のようになりました。常にこうなるわけではありませんが :-)
現在のCPUは C-MOS 構成なので、消費電力は周波数に正比例します。
ほぼ、CPUはこの割合で消費電力低減になるはずです。

毎月の電力使用量にどう反映するか様子を見たいと思います。

2011/12/01(木)[Perl5] 騙されたなぁorz

Perlにて UNIXドメインソケットを使う際の話。 どうやるんだっけかな? ということで、すぐに思い出せないので、 Perl CookBook 第一版 に掲載されているものを、「こうだっけかな~」と思いつつ参考に。
use IO::Socket;

unlink "/tmp/mysock";
$server = IO::Socket::UNIX->new(LocalAddr => "/tmp/mysock",
                                Type      => SOCK_DGRAM,
                                Listen    => 5 )
    or die $@;

$client = IO::Socket::UNIX->new(PeerAddr  => "/tmp/mysock",
                                Type      => SOCK_DGRAM,
                                Timeout   => 10 )
    or die $@;
しかし、はっきり言って騙されました。 見かけ上は起動するけれど、実際はソケットファイルが作成されないです。 これが、現行で正しい例:
use IO::Socket

my $socket_path = '/tmp/wibble';
unlink($socket_path);
my $server = IO::Socket::UNIX->new( Type => SOCK_STREAM,
                                    Local => $socket_path,
                                    Listen => 5 )
   or die("Can't create server socket: $!\n");

my $sock    = $server->accept() or die("Can't accept connection: $!\n");

my $client  = IO::Socket::UNIX->new( Type => SOCK_STREAM,
                                     Peer => $socket_path, )
   or die("Can't connect to server: $!\n");
LocalAddr ではなく Local 、 PeerAddr ではなく、Peer です。

今更ながら気付いたのですが、Perl CookBook 第一版 は、2001年刊行の本でした。
Perl 4 から Perl 5 に移行して間もない頃で、確かにハッシュパラメータ名などは違っていたかも・・・です。

2011/11/28(月)ProFTPD 1.3.4 以降の mod_ldap 関連設定

2017/10/12 4:42 サーバ運営・管理
今朝未明、試験的に ProFTPD を 1.3.3e から 1.3.4a へ久々のアップデートを行ったが、いざ動作させてみると、接続できず。。
サーバ側の /var/log/messages に以下のメッセージが残っていました:
proftpd[10975]: Fatal: unknown configuration directive 'LDAPDNInfo'
on line 35 of '/usr/local/etc/proftpd.conf'


最初はバグか?と思っていたのですが、つたない英文読解能力で google 先生の情報を漁ってみると・・ディレクティブが一部変わっている模様・・orz
日本語の情報が見当たらないので、今回遭遇した変更点をまとめてみました。
以下のように変更しないと LDAPを利用したユーザ認証が機能しません。

<変更前>
LDAPDNInfo       〔管理者DN〕 〔管理者パスワード〕
LDAPDoAuth on "dc=user,dc=account,dc=isp" "(&(uid=%v)(status=valid))"
LDAPDoUIDLookups on "dc=user,dc=account,dc=isp" "(&(uidNumber=%v)(status=valid))"
LDAPDoGIDLookups on "dc=group,dc=account,dc=isp" "(&(gidNumber=%v)(status=valid))"

<変更後>
LDAPBindDN      〔管理者DN〕 〔管理者パスワード〕
LDAPUsers "dc=user,dc=account,dc=isp" "(&(uid=%v)(status=valid))"
LDAPGroups "dc=group,dc=account,dc=isp" "(&(gidNumber=%v)(status=valid))"

・LDAPDNInfo → LDAPBindDN
・LDAPDoAuth → LDAPUsers
・LDAPDoUIDLookups → 削除
・LDAPDoGIDLookups → LDAPGroups

書式もちょっと変わったようなので、よく見て比較してみてください。
また、ここに記載されている内容は、弊社独自のものなので、各自の環境に合わせて適宜変更してください。そのままコピーしても無駄です。
また、ここに出てこないディレクティブは変更不要のようです。

当たり前の話ですが、意味を理解してから使いましょう。