【Perl】DBIx::Simple で副問い合わせや JOIN を使う

DBIx::Simple + SQL::Abstract を使うと簡単な SQL だと記述が簡潔にすむのだが、副問い合わせや JOIN を使い出すと途端に複雑になる。こういう場合は素直に素の SQL を書いた方がいいのだが、無理矢理にでも書くときはどうなるかやってみる。

WHERE 句にリテラル SQL を書く

文字列ではなく、文字列リファレンスを使う。例えば誕生日の「日」より「月」の方が数値として大きい(五月四日とか一〇月三日とか)人のリストを得たいとする。

SELECT id, name
FROM directory
WHERE MONTH(birthday) > DAY(birthday)

これを DBIx::Simple で表すとこうなる。

my $ds = DBIx::Simple->new($dbh);
my $rs = $sa->select('directory',
    ['id', 'name'],
    { 'MONTH(birthday)' => { '>' => \'DAY(birthday)' } },
    # { 'MONTH(birthday)' => \'> DAY(birthday)' },
);

Continue reading

【Perl】DBIx::Simple ノススメ

  1. はじめに
  2. DBIx::Simple + SQL::Abstract
  3. 単行取得メソッド
  4. 全行取得メソッド
  5. オブジェクトを返すメソッド

はじめに

Perl において DB に接続し、SQL を扱うモジュールはもちろん DBI モジュールな訳だが、これを格段に使いやすくしてくれる DBIx::Simple モジュールというのがある。

use DBIx::Simple; – 今日のCPANモジュール(跡地)
http://e8y.net/mag/009-dbix-simple/

このサイトのまとめが非常に分かり易い。例を挙げるとこんな感じ。

Continue reading

端末上の Vim からローカルにコピーする

端末アプリ + GNU Screen を使ってリモートサーバでコーディングしているとコピー & ペーストで詰まることがよくある。Screen 内でコピーした文字列を手元のブラウザで検索しようとしたとき、マウスでドラッグして選択するしか方法がないので、いちいちキーボードから手を離すのが億劫だったのだ。それを解決してくれるのがこれ。

ssh先screenのペーストバッファをクリップボードに貼り付ける – Keep It Simple, Stupid
http://yskwkzhr.blogspot.com/2011/04/copying-remote-screen-paste-buffer.html

参考サイトの通りに設定すると、たとえば Ctrl + aCtrl + ] を押すことでコピーした内容がローカルのクリップボードに貼り付けられる。後はメモ帳でも Firefox でも何にでも貼り付ければいい。

Continue reading

【Vim】タブ、空白、改行を可視化する

2011-01-19_183458.png

他人のコード開いたら(自分なら)空白にすべきところがタブになってたり、行末に謎のスペースが連続してたりしてムカッと来ることあるよね。そういう場合にも落ち着いて対処するために、不可視文字を画面に表示する設定がある。

vimでスペースやTabなどの見えない文字を表示させる方法
http://d.hatena.ne.jp/potappo2/20061107/1162862536

» [.vimrc] “invalid argument….”
https://bbs.archlinux.org/viewtopic.php?id=55671

Vim: listchars
http://www.flickr.com/photos/hail2u/3817627320/

以上のようなサイトを参考にして設定して二行を .vimrc に書き加えた。順に説明しよう。

set list
set listchars=tab:»-,trail:-,eol:↲,extends:»,precedes:«,nbsp:%
set list

不可視文字を表示しますよ。という設定。どのように表示するかは次の一行で決める。

set listchars=tab:»-,trail:-,eol:↲,extends:»,precedes:«,nbsp:%
tab:»-
“タブ”の表示を決定する。値は 2 文字で指定し、タブがスペース 8 文字に当たる場合、“»-------”などと表示される。
trail:-
行末に続くスペースを表す表示。
eol:↲
改行記号を表す表示。
extends:»
ウィンドウの幅が狭くて右に省略された文字がある場合に表示される。
precedes:«
extends と同じで左に省略された文字がある場合に表示される。
nbsp:%
不可視のスペースを表す表示。ただし、この記号の通りに表示されるのは“ ”、つまり、ノーブレークスペースに限られており、ほかの不可視スペース
(画像に挙げた ​、、などなど)
には効果がない。

と、ここまではよいのだが、一つだけ抜けてるものがある。そう、全角スペースはこれによっても表示されないのだ。そこは先人の知恵を拝借。

コアテクの路地: vim: 見えない文字を見えるようにする
http://blog.miraclelinux.com/ctd/2006/07/vim__32e1.html

" 全角スペース・行末のスペース・タブの可視化
if has("syntax")
    syntax on

    " PODバグ対策
    syn sync fromstart

    function! ActivateInvisibleIndicator()
        " 下の行の" "は全角スペース
        syntax match InvisibleJISX0208Space " " display containedin=ALL
        highlight InvisibleJISX0208Space term=underline ctermbg=Blue guibg=darkgray gui=underline
        "syntax match InvisibleTrailedSpace "[ \t]\+$" display containedin=ALL
        "highlight InvisibleTrailedSpace term=underline ctermbg=Red guibg=NONE gui=undercurl guisp=darkorange
        "syntax match InvisibleTab "\t" display containedin=ALL
        "highlight InvisibleTab term=underline ctermbg=white gui=undercurl guisp=darkslategray
    endfunction

    augroup invisible
        autocmd! invisible
        autocmd BufNew,BufRead * call ActivateInvisibleIndicator()
    augroup END
endif

110423-0001.png

set list と意味がかぶる行はコメントにしてある。これを .vimrc に書き加えれば完成だ。

旧「漢語林」が最強過ぎる件

地震やら原発やら何やらでだいぶ更新が滞っていた。いつもの趣旨とはかなり違うが、前に書いた日記が残っていたので載せておく。

IMG_0680.jpg

昔々……

祖父が生きていた頃は書道教室をやっていて、その家には様々な漢籍や、戦前に刊行された分厚い辞典が置いてあった。それは、小学校で使う教育漢字レベルの辞書とは比べようもない迫力があり、子供の時分は祖父の家に行くたび、その辞典を眺めて時間をつぶしていた。

Continue reading

【Vim】新機能“conceal”構文属性を使う

Vim 7.3 の新機能“conceal”の使い道がよくわからなかったのだが、こんな使用例があるようだ。

js-mask – More concise JavaScript using Vim’s “conceal” feature : vim online
http://www.vim.org/scripts/script.php?script_id=3324

Javascript では“function(){}”をひたすら重ねていくのでコードが冗長になりがち。それを見た目なりときれいにしてしまおうというのがこのプラグイン。

例えばこんなコードが、

// 1~5の合計「15」と表示する
(function(){
    alert(
        (function( ary ){
            function sum( a ) {
                var s = 0;
                a.forEach( function( i ){ s += i } );
                return s;
            }
            return sum( ary );
        })( [ 1, 2, 3, 4, 5 ] );
    );
})();

Continue reading