Perl で、ファイルをロック・アンロックする方法

ファイルのロックアンロックは、flock 関数を使う方法もあるが、この方法はすべてのプラットフォームで使えるというわけではない。 そのため、OS のシンボリックリンク機能を使う。OS がファイルを作成するときに排他制御を行うのを利用する。空のファイルを作成し、そのファイルが存在するかどうかチェックする方法と一見変わらないように見えるが、この方法だとファイルをオープンし、クローズするという2ステップが必要となる。このため、完全な排他にはならない。よって、シンボリックリンクというところがミソである。シンボリックリンクの他には、ディレクトリを作成する方法、ファイル名を変更する方法もあるが、私が知る限りはこの方法を紹介しているサイトが多いように思う。 使用するモジュール
なし
#!/usr/bin/perl

our $HOME_DIR = 'ホームディレクトリをここに書く';
our $LOCK_DIR = "$HOME_DIR/lock";     # このディレクトリのアクセス権は 777 である。
our $LOCK_FILE = 'ロックするファイル名をここに書く。なんでもよい。';

sub file_lock {
   my $wait = 5;
   while (!symlink(".","$HOME_DIR/$LOCK_DIR/.$LOCK_FILE"))   {
       if (--$wait <= 0) {
           # &error('現在他の方が使用中です。しばらくしてから再度ご利用ください。');
       }
       sleep (1);
   }
}

sub file_unlock {
   unlink ("$HOME_DIR/$LOCK_DIR/lock/.$LOCK_FILE");
}

1;
ファイルのロックアンロックは、flock 関数を使う方法もあるが、この方法はすべてのプラットフォームで使えるというわけではない。 そのため、OS のシンボリックリンク機能を使う。OS がファイルを作成するときに排他制御を行うのを利用する。空のファイルを作成し、そのファイルが存在するかどうかチェックする方法と一見変わらないように見えるが、この方法だとファイルをオープンし、クローズするという2ステップが必要となる。このため、完全な排他にはならない。よって、シンボリックリンクというところがミソである。シンボリックリンクの他には、ディレクトリを作成する方法、ファイル名を変更する方法もあるが、私が知る限りはこの方法を紹介しているサイトが多いように思う。 使用するモジュール
なし
#!/usr/bin/perl

our $HOME_DIR = 'ホームディレクトリをここに書く';
our $LOCK_DIR = "$HOME_DIR/lock";     # このディレクトリのアクセス権は 777 である。
our $LOCK_FILE = 'ロックするファイル名をここに書く。なんでもよい。';

sub file_lock {
   my $wait = 5;
   while (!symlink(".","$HOME_DIR/$LOCK_DIR/.$LOCK_FILE"))   {
       if (--$wait <= 0) {
           # &error('現在他の方が使用中です。しばらくしてから再度ご利用ください。');
       }
       sleep (1);
   }
}

sub file_unlock {
   unlink ("$HOME_DIR/$LOCK_DIR/lock/.$LOCK_FILE");
}

1;

Perl で、JPEG の画像を扱う方法

グラフィックライブラリである GD を使用する。GD は PNG をサポート JPEG は必須だと思われるがその場合には (CPANの GD ではなくライブラリの) GD 自体、jpeg6b というライブラリが必要である。ない場合はインストールが必要である。ウェブでの JPEG 画像の表示は、以下のサンプルを参考に、宿題として考えてみて欲しい。 使用するモジュール
use GD;
#!/usr/bin/perl

use GD;
open (OLD, "original.jpg") || die "cannot open mayon.jpg¥n";
$oldImage = newFromJpeg GD::Image(¥*OLD) || "Cannot make old image object¥n";

@bound = $oldImage->getBounds();
print "original width: $bound[0] original height: $bound[1] ¥n";
$newImage = new GD::Image(40, 40) || die "cannot make new image object¥n";
$newImage->copyResized($oldImage, 0, 0, 0, 0, 40, 40, $bound[0], $bound[1]);
open NEW, ">nail.jpg";
binmode NEW;
print NEW $newImage->jpeg;
close OLD;
close NEW;

1;
グラフィックライブラリである GD を使用する。GD は PNG をサポート JPEG は必須だと思われるがその場合には (CPANの GD ではなくライブラリの) GD 自体、jpeg6b というライブラリが必要である。ない場合はインストールが必要である。ウェブでの JPEG 画像の表示は、以下のサンプルを参考に、宿題として考えてみて欲しい。 使用するモジュール
use GD;
#!/usr/bin/perl

use GD;
open (OLD, "original.jpg") || die "cannot open mayon.jpg¥n";
$oldImage = newFromJpeg GD::Image(¥*OLD) || "Cannot make old image object¥n";

@bound = $oldImage->getBounds();
print "original width: $bound[0] original height: $bound[1] ¥n";
$newImage = new GD::Image(40, 40) || die "cannot make new image object¥n";
$newImage->copyResized($oldImage, 0, 0, 0, 0, 40, 40, $bound[0], $bound[1]);
open NEW, ">nail.jpg";
binmode NEW;
print NEW $newImage->jpeg;
close OLD;
close NEW;

1;

自分のマシン (開発環境)

作者のプロフィール

  • 米国在住、今のところ日本に住所なし、子持ち。 このサイトでは PerlPHPAJAX、Java、Drupal について筆者が学んだことやノウハウを書いていきます。
  • 得意な言語は Java と Perl。他に PHPJavaScript、C、Visual C++、Visual Basic、SQL、HTML/CSS、awk あたりがイケます。Python はサワリだけ。まぁ、とりあえずどんな言語でも OK です。コンピュータ言語に限らず TOEIC のスコアは過去最高 920 (2005/10) なので一応英語もイケます。
  • 業務で使用していた/している言語は Java、C と Visual C++、PHP、JavaScript あたりで、Perl はほとんど仕事では使ったことはありません(ないとはいえないですが)。Java については J2ME (iアプリ / MIDP)、J2SE、J2EE まで OK、ネットワークプログラミング、UML、クラス設計なんでもイケます。でも実際自分の中で仕事として一番得意なのはパワポで企画書を描くことだと思っています。クリップアートは今では全部自分で描いたものを使います。
  • 本業では Java を使ったケータイの企画、システム開発を手がけてきました。その一方でプライベートではケータイをシステム手帳にバージョンアップするサイト i-Services を 2000 年 5 月に公開しています (こちらは Perl で書いています)。Java についてはすでによく知っていたのですが、2000 年時点では Perl についてはまったくの初心者でした。しかしこのサイトを作っているうちに Perl のほぼすべての基本パターンの要素は修得したと考えております。
  • このサイトに書かれている内容は少々レベルが高いものがあるかも知れませんがご容赦ください。 このサイトは基本的にリンク自由です。
  • 米国在住、今のところ日本に住所なし、子持ち。 このサイトでは PerlPHPAJAX、Java、Drupal について筆者が学んだことやノウハウを書いていきます。
  • 得意な言語は Java と Perl。他に PHPJavaScript、C、Visual C++、Visual Basic、SQL、HTML/CSS、awk あたりがイケます。Python はサワリだけ。まぁ、とりあえずどんな言語でも OK です。コンピュータ言語に限らず TOEIC のスコアは過去最高 920 (2005/10) なので一応英語もイケます。
  • 業務で使用していた/している言語は Java、C と Visual C++、PHP、JavaScript あたりで、Perl はほとんど仕事では使ったことはありません(ないとはいえないですが)。Java については J2ME (iアプリ / MIDP)、J2SE、J2EE まで OK、ネットワークプログラミング、UML、クラス設計なんでもイケます。でも実際自分の中で仕事として一番得意なのはパワポで企画書を描くことだと思っています。クリップアートは今では全部自分で描いたものを使います。
  • 本業では Java を使ったケータイの企画、システム開発を手がけてきました。その一方でプライベートではケータイをシステム手帳にバージョンアップするサイト i-Services を 2000 年 5 月に公開しています (こちらは Perl で書いています)。Java についてはすでによく知っていたのですが、2000 年時点では Perl についてはまったくの初心者でした。しかしこのサイトを作っているうちに Perl のほぼすべての基本パターンの要素は修得したと考えております。
  • このサイトに書かれている内容は少々レベルが高いものがあるかも知れませんがご容赦ください。 このサイトは基本的にリンク自由です。