sql joinの条件とwhereの条件の違いについて

ケース1

left join t2 on t2.t1_id = t1.id AND t2.status = 'ERROR'

ケース2

left join t2 on t2.t1_id = t1.id
中略
where t2.status = 'ERROR'

ケース1の場合は結合前の条件となるため、ERRORでないt2のデータもNULLとしてデータを取得する。
ケース2の場合は結合後の条件となるため、ERRORでないt2のデータはおろかt1のデータも取得できなくなってしまう。(inner joinならどちらも一緒)

要はleft joinしているテーブルに対する条件はwhereには記述しない方がよいってことか。

俺は何年sqlをやっているんだろう。やっぱり死んだ方がいいな。

css div内のある要素だけ余白を無視したい場合はネガティブマージンを使えばよい

例えばdiv内に15pxのpaddingが設定されていてその中にimgタグを入れるケースでimgタグだけ15pxのpaddingの設定を無視したい場合、imgタグに-15pxのmarginを設定してやれば、imgタグにはpaddingが適用されなくなる。

jquery slickとphotoswipeを連携する

前記事
jquery bxsliderとphotoswipeを連携する - 技術ブログ

bxsliderの挙動がスマホだといまいち(スワイプ中にスクロールしてしまう等)だったのでslickに変更。

http://kenwheeler.github.io/slick/
slick
http://photoswipe.com/
photoswipe

slickで画像をスライド表示させ、画像クリック時にphotoswipeで拡大表示させたい場合の話。
slickもliで画像を並べたい場合、bxsliderと同じように「FIGURE」を「li」に変更する。さらにslickで「dots:true」にするとドットをクリックした時にエラーが出るのでliに適当なクラスを指定して条件に追加する。

変更前 js

var clickedListItem = closest(eTarget, function(el) {
  return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
});

変更後 js

var clickedListItem = closest(eTarget, function(el) {
  return (el.tagName && el.tagName.toUpperCase() === 'LI' && el.className && el.className.indexOf('img-li') != -1);
});

html

<ul class="item-img my-gallery">
 <li class="img-li"><a href="large1.jpg" data-size="1024x1024"><img src="small1.jpg" /></a></li>
 <li class="img-li"><a href="large2.jpg" data-size="1024x1024"><img src="small2.jpg" /></a></li>
</ul>

もう一個やっかいなのが、slickはliタグの前後に余計なcloneタグを作ってしまい、photoswipeがそれも拾ってしまって表示した時にカウンターとスライドがおかしくなるため、slickのオプションに「infinite: false」を指定すること。(ただしこれを指定するとslickのループが無効になる)

$('.item-img').slick({
  infinite: false,
  dots:true
});

あっちが立てばこっちが立たない。汎用的なライブラリだとそんなんばっかり。妥協したくなければ結局自分で作るしかないってことだわ。

低予算で始められるおすすめのFX口座はこちら。
http://s2fx.com/ranking/856.html

php fatalエラーの補足方法

バッチがメモリ不足等で落ちた場合にFatalエラーが発生するけど通常fatalエラーはtry-catchはおろか、set_error_handlerでも補足できない。
そのためregister_shutdown_functionを使う必要がある。

<?php
register_shutdown_function('shutdown');
function shutdown(){
    // 最後のエラーを取得
    $error = error_get_last();
    if (empty($error)) {
        return;
    }
    if ($error['type'] == E_ERROR) {
        // Fatalエラー(E_ERROR)の場合の処理
    }
}

16/11/5追記
php5.2未満ではerror_get_last()が使用できない。php5.1.6の環境での代替案を調べてみたけど無さそうだったのであきらめるしかない。ちなみにerror_get_last()でFatalかどうか判定しないと通常にexitした場合との判別が出来ないのでerror_get_last()使えないとやっぱり困る。

17/1/31追記
今まで無条件にバッチ実行する際に標準出力を全部捨てていたんだけどこれを拾えばよかっただけの話だった。

* * * * * xx.sh > /dev/null 2>&1

これを辞めて

* * * * * xx.sh >> /../log/`date +\%m\%d`.log 2>&1

このような感じでログに出す

参考サイト
floatingdays: PHPで Fatal Error時の状況を調べる方法
[PHP]Fatal Error発生時にログを作成する | PHP Archive
PHP の「エラー処理ハンドラ」「シャットダウンハンドラ」「例外処理ハンドラ」の挙動 - Web/DB プログラミング徹底解説

cakephp1.2 バッチ(Shell)からControllerのメソッドを呼びたい

Shell側は以下のようになる

<?php
App::import('Core', 'Controller');              
App::import('Controller', 'Users'); // UsersController

class SampleShell extends Shell {
    function initialize() {
        $this->Users = new UsersController();
    }
    function main() {
        $this->Users->func();
    }
}

通常ShellからControllerのメソッドを呼ぶような事はしないんだけど、今回はprotectedなメソッドを持つclass(classAとする)をshellから呼びたかったんだけど、shellはShellを継承しているため(classA)を継承できなくて、同じメソッドをコピーなんてしたくないしとはいえ根底を変えるような面倒なこともしたくないし仕方なくclassAを継承していたControllerを経由してclassAのprotectedなメソッドを呼び出すようにした。
本当だったら継承先以外からアクセスがある時点でprotectedをpublicに変更すべきなんだけど色々と面倒なのでこのように対応したという訳。
【※注意】通常Controllerのpublicなメソッドはアクションとしてブラウザからもアクセスできるため公開してない管理者用の画面とかに限定すること。
死にたい。

低予算で始められるおすすめのFX口座はこちら。
http://s2fx.com/ranking/856.html