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

cakephp1.2 queryで更新系SQLを実行した時の戻り値はtrueではない

例えば以下のような処理があったとして

<?php
$sql = "update tbl set col = 'aaa', modified = now() where id = ?";

$param = array();
$param[] = $id;

$ret = $this->query($sql, $param);

sqlが正常に完了してもqueryの戻り値は【trueにはならず】に【空のarray()】が返る。
はい、1時間はまりました~。貴重な人生の1時間を無駄にしました~。

空のarrayなので【if(!$ret)】とかで判定してはいけない。sqlに問題があった場合は、【false】が返るので【if($ret===false)】で判定しないといけなかった。
あほすぎる~。自分ぶっ殺して~。

ちなみに影響を受けた行を取得したい場合は【getAffectedRows】を使えばよい。正常でも値に変更が無ければ【0】を返すので注意。まあ例のように更新日時をセットにすれば問題無いと思うが。

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

参考サイト
php - CakePHP get affected rows of raw SQL statement - Stack Overflow