マンガとキャッシュとスワイプとManga Swipe

404 Blog Not Found:perl+javascript - なんちゃってマンガロイドをみてなかなか面白いなぁと思ったけれど、やっぱりAjaxだとキャッシュ(ページの先読み)が効かないのでページをめくるときにラグがあってなんだかイマイチ操作性悪いなぁと思ったのでスワイプで見られるようにManga Swipe作ってみた。

もっと作りこめば面白いこと出来そう。

工夫してみたことろ

画像を小さく

iPhoneで快適に見られるサイズだとこれが限界のようで、デバイスの性能に引っ張られる形。Imagerで小さくした。

ページ先読み

ページ先読み(の代替手段)として、display:none;な画像を事前にダウンロードさせる形式。
一度読み込みが完了すればリクエストは発生しないのでページめくりがスムーズにできる。

雑感

やっぱりモバイル用にコマ割りしてないとセリフが小さくて読みにくい。この問題は個人ではどうしようもなくて、オリジナルがそれに合わせた形でないとお手上げ状態。
キャッシュに関しては通信量との兼ね合いで、画像を少なめにしてページを大量に用意するような方法であれば、しおり替わりにもできるし長編でも読破できそうな印象。

Test::Continuous(autoprove)をサーバにインストールするには

Test::Continuous(autoprove)とは

ファイルを監視して、変更があった場合に自動でテストを走らせる autoprove というコマンドラインツールを含む便利なモジュール

インストール

cpanm の --interactive オプションを使って Log::Dispatch::DesktopNotification をインストールしないようにする

$ cpanm Test::Continuous --interactive

...

[Graphical notifications]
- Log::Dispatch::DesktopNotification ...missing.
==> Auto-install the 1 optional module(s) from CPAN? [y] n

原因

autoprove をGUIのないサーバに(cpanmのデフォルトオプションのまま)インストールしようとすると Log::Dispatch::DesktopNotification のインストールを試みる。
Linux の場合は芋づるで依存が Gtk2 まで広がり、Pango や Glib や Cairo まで依存関係が広がってしまうため最終的にインストールがコケる。

SSHFSが便利なのでメモっておく

随分前から使っているSSHFSがなかなか便利。

SSHFSとは

SSHFSはリモート(サーバ)のディレクトリをマウントしてひとつのボリュームとして扱えるようにするファイルシステムのことで、サーバ側ではsshdさえ設定してあればクライアントのセットアップだけで使えるようになる。
基本的にはDropboxからキャッシュ機能を引いたものと同じと考えても問題ないでしょう。Dropboxに見られると嫌な書類をおいておくのは気持ち悪い*1 / *2&容量面でMP3を置くのが躊躇われるので、そこそこ使い道はありそう。

使い道

最近は

  1. iTunes Media ディレクト
  2. ドキュメント類

をサーバに置いて、クライアントではそれをマウントする形で利用中。

セットアップ

サーバ側はSSHの設定さえしてあれば何もする必要はない(必要に応じてディレクトリを作っておくくらい)なので、クライアント側をセットアップ。

Linuxの場合は

sudo apt-get install sshfs
sshfs host:/path/to/dir path/to/mount/point

だけ。

以下MacOSXの場合を紹介。

インストール

この2つをインストール。名前が酷似していてややこしいので取り違えないように注意。
macfuseがないと接続できないので必ずインストールしておく。

Macfusionを起動

Macfusionは~/.ssh/configの設定通りに private key を選んでくれている(っぽい)ので、普段からしっかり設定してある場合は何もせずにMacfusionを起動し、

このように画面の通り設定するだけでマウント/アンマウントできる。

git push + さくらのレンタルサーバーで github pages ライクにデプロイする方法

static なサイトを作るにあたっては、「コミット + scp などでファイルを一気に転送」を繰り返すことがよくある方法だと思う。 github pages のように、 git push のみでできると楽なのでこの環境を構築してみた。

さくらレンタルサーバー以外でも使える方法なのでそこそこ応用が効きそう。

サーバに git 環境を構築する

% cd $HOME
% mkdir tmp; cd tmp;
% wget http://kernel.org/pub/software/scm/git/git-1.7.6.tar.gz
% tar xvf git-1.7.6.tar.gz
% cd git-1.7.6
% ./configure --prefix=$HOME/local
% gmake
% gmake install
% vi $HOME/.profile
PATH に $HOME/local/bin を追加し、$HOME/.profile を読みなおす
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$HOME/bin:$HOME/local/bin; export PATH

bare repository を準備する

% cd $HOME
% mkdir -p repos/www
% cd repos/www
% git init --bare
hooks/post-receive を編集する

push された後にフックすることで、pushと同時に公開ディレクトリにファイルを展開する事ができる。

% cd $HOME/repos/www
% cp hooks/post-receive.sample hooks/post-receive
% vi hooks/post-receive

以下のように編集する。さくらの場合は $HOME/www が公開ディレクトリ。

#!/bin/sh

env GIT_WORK_TREE=$HOME/www git checkout -f

ローカルに戻って編集作業

$ git clone user@user.sakura.ne.jp:/home/user/repos/www
$ cd www
$ touch index.html
$ git add .
$ git commit -m 'initial commit'
$ git push origin master

これで push された内容が反映されている。次回の push からは `git push` のみで反映させることができる。

簡単!

SQL文をテストする

書いたSQLシンタックスチェックを自動化する

スキーマを書くときにはSQLを書くわけですが、作る過程では変更後のシンタックスが正しいか確認するのが意外と手間だったりします。
カンマ付け忘れや typo は自動でチェックしたいですね。

そんな時は Test::mysqld を使うと手軽に CREATE TABLE 文の文法チェックをテストに含めておけるので、
下記のようなテストを準備しておくとよさそうです。

t/sql/01_create_table.t

use strict;
use warnings;
use Test::mysqld;
use Test::More;
use DBI;

# debian installs mysqld into /usr/sbin
$ENV{PATH} = $ENV{PATH} . ':/usr/sbin';

my $mysqld = Test::mysqld->new(
    my_cnf => { 'skip-networking' => '' }
) or plan skip_all => $Test::mysqld::errstr;

my $dbh = DBI->connect( $mysqld->dsn );

for my $file (glob "schema/*") {
    my @sqls = (sub {
        open my $fh, "<", $file or die $!;
        grep { not /^\s?$/ } split /;/, do{ local $/; <$fh> };
    })->();

    for my $sql (@sqls) {
        note $sql;
        ok $dbh->do($sql), 'CREATE TABLE';
    }
}

done_testing;

App::cpanmigrate

前回エントリーに

とコメント頂いたので
App::cpanmigrate - migrate installed modules to new environment - metacpan.org
として出しました。

まだbashしか対応していませんが、他の環境用の pull request いただければ merge で対応します。

「え、シェルスクリプトなの?」

実行される本体はシェルスクリプトを exec (正確には bash -c)しているだけ(参考:How can I use bash syntax in Perl's system()? - Stack Overflow)ですが、

とのこと。

http://search.cpan.org/dist/Text-CSV-UniqueColumns/lib/Text/CSV/UniqueColumns.pm

たしかにコレは…!