読者です 読者をやめる 読者になる 読者になる

SQL_MakerをComposerでインストールできるようにした

php composer

PerlSQL::MakerをPHPに移植して作ったSQL_Makerを、
書き直してPackagistにアップロードしてみました。

https://packagist.org/packages/uchiko/sql-maker

これでComposerからインストールすることができます。

導入手順

以下のコマンドでcomposer.pharをインストール。

$ curl -s http://getcomposer.org/installer | php

以下の内容のcomposer.jsonを作成します。

{
    "require": {
        "uchiko/sql-maker": "dev-master"
    }
}

以下のコマンドで、モジュールをインストールします。

$ php composer.phar install

vendorディレクトリにモジュールがインストールされます。

使用する

以下のように使用できます。

<?php

require_once 'vendor/autoload.php';

$builder = new uchiko\SQL\Maker(array('driver' => 'SQLite'));

$fields = array();

$where = array();
$where['area'] = 'houen';
$where['type'] = array( 'like' => '%electric%' );

$opt = array();
$opt['order_by'] = array('id');

list($sql, $binds) =
    $builder->select($table, $fields, $where, $opt);

var_dump($sql);
var_dump($binds);

/*
 * $sql   => "SELECT id, name
 *            FROM pokedex
 *            WHERE (area = ?) AND (type LIKE ?)
 *            ORDER BY id"
 * $binds => ("houen", "%electric%")
 */


ComposerでBundlerやCartonみたいなことができるのは面白いですね。
名前空間にベンダー名を入れるのは少し気になりますが。

!!1する意味が分からない

perl

1と!!1の違いが分からない。
!!'test' ならやりたいことは分かる。
!!1はやりたいことが分からない。

ひとまずDumpしてみた。

use strict;
use warnings;
use Devel::Peek;

# SV = IV(0xdf12788) at 0xdf12798
#   REFCNT = 1
#   FLAGS = (IOK,READONLY,pIOK)
#   IV = 1
Dump(1);

# SV = PVNV(0xdefde30) at 0x74cea0
#   REFCNT = 2147483644
#   FLAGS = (IOK,NOK,POK,READONLY,pIOK,pNOK,pPOK)
#   IV = 1
#   NV = 1
#   PV = 0xdefeb10 "1"\0
#   CUR = 1
#   LEN = 16
Dump(!!1);

分からない。

追記

強調なんですね。確かに「んん!?」となりましたが。

ルーティング設定に名前をつける

mojolicious

以下のようにルートに名前をつけることが出来ます。

# Mojolicious::Liteの場合
get '/hoge/detail/:id' => sub { ... } => 'hoge/detail';

# Mojoliciousの場合
$r->get('/hoge/detail/:id')->to('hoge#detail')->name('hoge/detail');

このようにしておくと、
url_forやredirect_toを以下のように書くことができます。

$c->url_for('hoge/detail', id => 1);          # -> /hoge/detail/1
$c->redirect_to('hoge/detail', id => 2);    # -> /hoge/detail/2

とても便利ですね。


また、stashにidの値がすでに入っている場合、自動的に「:id」に値が挿入されます。

warn $c->stash->{id};       # -> 1
$c->url_for('hoge/detail'); # -> /hoge/detail/1

ページャなどで、idを引き継ぐ必要がある場合に便利ですね。

emacsclientでtty関連のエラーが出る

emacs

http://www.emacswiki.org/emacs/EmacsAsDaemon#toc17

他のユーザーから切り替えたユーザーでemacsclientを実行すると、
以下の様にttyでエラーが出ます。

*ERROR*: Could not open file: /dev/pts/1

ユーザーを切り替えるときはsshを使ったほうが良いみたいです。

$ ssh hogehoge@localhost

Orepanでローカルミラーを作成・管理する

perl

プロジェクトが依存しているモジュールをローカルミラーで管理します。
ローカルミラーはプロジェクトのバージョン管理下に入れます。
こうすることで、依存モジュールのバージョンを固定することができます。

管理ツールインストール

ローカルミラーを管理するツールOrePANをインストールします。

$ cpanm OrePAN

ローカルミラーを作成する

cpanmコマンドを使って、ローカルミラーを作成します。
基本は「--save-dists」オプションを使い、ローカルミラーを作成していきます。


以下のようにcpanmコマンドを実行します。

$ cpanm -L local-tmp --save-dists=cpan-mirror Mojolicious


バージョンを指定してインストールしたい場合は、「Mojolicious@3.82」というように@をつけて指定します。

$ cpanm -L local-tmp --save-dists=cpan-mirror Mojolicious@3.82


Makefile.PLで一括で行いたい場合は、「--installdeps」オプションを使用します。

$ cpanm -L local-tmp --save-dists=cpan-mirror --installdeps .

local-tmpは作業用のディレクトリなので削除してください。


ダウンロードしたファイルの確認は以下のコマンドで行えます。

$ find ./cpan-mirror -name "*.tar.gz"

インデックスの作成

orepan_index.plを利用してインデックスを作成します。

$ orepan_index.pl -r ./cpan-mirror

バージョン管理システムに登録

作成したcpan-mirrorをaddしてください。

$ git add cpan-mirror

ローカルミラーからCPANモジュールをインストール

以下のコマンドで依存モジュールをローカルミラーからインストールすることができます。

$ cpanm --mirror=/path/to/cpan-mirror --mirror-only --installdeps .

ローカルミラーに依存モジュールを追加する

Makefile.PLに依存モジュールを追加し、以下のcpanmコマンドを実行します。

$ cpanm --save-dists=cpan-mirror --installdeps .

ローカルミラーに足りないものだけがダウンロードされます。

そして、インデックスを再生成します。
すでにあるインデックスはrmで削除してください。

$ rm cpan-mirror/modules/02packages.details.txt.gz
$ orepan_index.pl -r cpan-mirror

オリジナルモジュールを追加する

オリジナルモジュールは「make dist」か「./Build dist」でtarballに変換してください。

作者名を指定してローカルミラーに登録します。

$ orepan.pl -d cpan-mirror -p MEMEMEMOMO Hogehoge.tar.gz

モジュールを削除する

tarballを削除してインデックスを再生しします。

$ rm cpan-mirror/authors/id/M/ME/MEMEMEMOMO/Hogehoge.tar.gz
$ rm cpan-mirror/modules/02packages.details.txt.gz
$ orepan_index.pl -r cpan-mirror

アンインストールは「App::pmuninstall」を使うと良いでしょう。

NotFound時の処理を書く

mojolicious

NotFoundページを表示するだけなら「$self->render_not_found」を使う。
表示以外の処理を書きたい場合は、after_dispatchフックを使う。

$self->hook(after_dispatch => sub {
     my $c = shift;
     if ($c->res->code eq '404') {
         # HogeHoge
         return $c->render_not_found;
     }
});