毎秒1000リクエスト を捌く超高速CMS「adiary」
2015/05/13(水)Lightbox2 にスワイプ対応パッチを充てた
充てたというかパッチしました。作りました。jQueryのみです。
- https://github.com/nabe-abk/adiary/blob/master/js/lightbox.js
- https://github.com/nabe-abk/adiary/blob/master/js/lightbox.min.js
画像をめくるときにタッチパネルのスワイプ操作でも反応するようになっています。特にアニメーションはしません。
jQueryのバグなのか「touchstart」「touchmove」イベントを全く拾わないので、「window.addEventListener」に逃げました。もしもっとスマートな解決方法を見つけたら教えてください。
これを使用しているadiaryもよろしくお願いします。
その他の変更点
#lightbox-min-width { display: none; width: 300px; }
と設定すると、横幅が小さすぎる画像を表示するとき、指定したピクセルまでアスペクト比を保持して拡大して表示します。
極端に縦長の画像の場合はアスペクト比を保持できて、画面に収まる範囲内で拡大されます。
2015/01/08(木)pure perl で JPEG の Exif を表示や削除したい
2014/08/28(木)Windows上での flock の不具合?
これだからWindowsは……。
ロック状態を変更できない
use Fcntl; my $fh; sysopen($fh, "test.txt", O_CREAT | O_RDWR) or die; flock($fh, Fcntl::LOCK_SH()); flock($fh, Fcntl::LOCK_EX()); close($fh);
Linuxなどでは、共有ロックが排他ロックに切り替わるのですが、Windows上では切り替えることができず*1、そのままブロッキングされてしまいます。
共有ロック状態でtruncateすると、ファイルサイズが固定される
use Fcntl; my $fh; sysopen($fh, "test.txt", O_CREAT | O_RDWR) or die; flock($fh, Fcntl::LOCK_SH()); truncate($fh, 0); # ファイルサイズを 0 に seek($fh, 0, 0); # ファイルポインタを先頭へ print $fh "test!!\n"; close($fh);
こんなテストプログラムを走らせます。LOCK_SH以外は、ロックを伴うファイル操作ではよく行う処理です。
LOCK_SH(共有ロック)は本来ならLOCK_EX(排他ロック)ですが、前項で述べたとおりWindows環境ではとりあえず共有ロックで開いておいて後から排他ロックに変更できないので、そのような状況を想定してLOCK_SHで記述してあります。
さてこのプログラムを実行すると、Windows上では0byteのファイルが作成されます。ActivePerl(5.14)の問題かもしれませんが、truncateでのファイルサイズ指定がそのままclose()後のファイルサイズになります。
不思議なことに、LOCK_EX(排他ロック)に変更するときちんと中身のあるファイルが作られます。
解決策
use Fcntl; my $fh; sysopen($fh, "test.txt", O_CREAT | O_RDWR) or die; flock($fh, Fcntl::LOCK_SH()); seek($fh, 0, 0); # ファイルポインタを先頭へ print $fh "test!!\n"; truncate($fh, tell($fh)); # 現在の位置でファイル切り詰め close($fh);
挙動まとめ
- Windowsでは一度ロックしたものに対し、再度ロックすることができない。
- 同じファイルハンドルを使用しても「別のロック」とみなされてしまう。
- Linux等では同じファイルハンドルを使えば、lockは何度でもできる(状態変更できる)。
別の問題
そもそもLOCK_SH(共有ロック)状態で書き換えようとすると、以前のサイズよりも大きくならず、そもそも書き変えられないという謎のバグに当たりました。
詳細な発生条件は不明ですが、めんどうくさいので、Windowsの場合共有ロックではなく最初から排他ロックをかけることにしました。