_onichannn

PHPのcURL自分用まとめ。

自分用メモ。

// postしたい場合は値を設定
$params = array(
	'id' => '',
	'password' => '',
);
// 初期化
$ch = curl_init();
// curl_exec() の返り値を 文字列で返す(通常はデータを直接出力)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Location: ヘッダの内容を再帰的に辿る
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// サーバーから受け取ったクッキーを保存するファイル名
// 既存ファイルでないとエラーになる可能性があるので注意
curl_setopt($ch, CURLOPT_COOKIEJAR, '/cookie');
// サーバーに投げるクッキーのファイル名
curl_setopt($ch, CURLOPT_COOKIEFILE, '/cookie');
// リクエストを行うURL
curl_setopt($ch, CURLOPT_URL, '');
// HTTP POSTを行うか否か
curl_setopt($ch, CURLOPT_POST, true);
// POSTするパラメーター
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
// 実行
$output = curl_exec($ch);
// リクエストを閉じて終了
// 返り値は無い
curl_close($ch);

COOKIEJAR、COOKIEFILEのパスはどこでもいいが、名前が「cookie」でないと正常に動いてくれない模様
↑そんなこと無かった。「_cookie」で動作確認済み。
基本的なリクエストは上記のoptionで事足りるはず。
その他使用頻度が高そうなoptionは以下。

// HTTPのリクエスト形式をGETに戻す
curl_setopt($ch, CURLOPT_HTTPGET, true);
// リクエスト結果の詳細情報を出力するか否か
curl_setopt($ch, CURLOPT_VERBOSE, true);
// 上記VERBOSEの結果を書き込むファイルパス
// STDERRはプロセスが完了した後でないとファイル出力しないので注意
curl_setopt($ch, CURLOPT_STDERR, '/path/to/vb');
// WRITEHEADERはプロセス実行中でもファイルに出力してくれる
curl_setopt($ch, CURLOPT_WRITEHEADER, '/path/to/hd');

適宜追記予定。

needle、haystack。

この英単語はPHPの公式リファレンスでよく見かける。

以前からどういう意味なんだろうと思いつつよく分からないまま放置していたが、調べてみると凄くしっくりきたのでメモ。

関数の引数部分にneedleとかhaystackとか書いてあって、いやどっちがどっちやねん。。。とか思ってたけど、非常に納得。

今後はわざわざ別ページに調べに行くこともなくなりそうである。

まず上記二つの英単語は「干し草」と「針」を意味している。

haystack = 干し草

needle = 針

もうこの時点であーなるほどって思ったけど、この単語が慣習的に用いられている理由は上記単語を用いた英語の慣用句にあるらしい。

 

needle in a haystack.
見つけることが不可能なもの。

look for a needle in a haystack.
望みのない捜し物をする、むだ骨を折る。

 

例えば文字列を検索する関数で、引数にhaystackとあれば、そこには検索対象文字列を渡し、needleには探したい文字列を渡せばいいわけである。

うん。とても理にかなっている。公式リファレンスに抵抗が無くなった瞬間であった。笑

Javascript、setTimeout()のthis問題。

直前の記事でsetTimeout()について触れたので、ついでにメモ。

下記ページより引用。
window.setTimeout – Web API リファレンス | MDN

 

setTimeout() によって実行されるコードは、setTimeout() が呼び出された関数とは別の実行コンテキスト内で実行されます。結果的に、呼び出された関数の this キーワードは window (または global) オブジェクトに設定され、setTimeout が呼び出された関数の this 値と同じにはなりません。この問題は JavaScript リファレンス でより詳細に説明されています。

 

とのこと。

一定間隔で定期実行したい処理などを記述する際、setTimeout()を用いると便利であるが、いつもの感覚でthisを使うと意図しない動作になるので注意されたし。

JavascriptのsetTimeout()は引数の渡し方に注意。

嵌ったのでメモ。

例えば下記のような関数が定義されていたとする。

var noname = function(arg1, arg2, arg3){
	console.log(arg1);
	console.log(arg2);
	console.log(arg3);
}

まずsetTimeoutで単純に関数を呼びたいだけの場合。
第1引数に関数名を指定する際、クオーテーションで括る方法と括らない方法があるので注意。

// 括る場合
setTimeout('noname()', 1000);
// 括らない場合
setTimeout(noname, 1000);

第1引数をクオーテーションで括った場合、関数名の後に括弧「()」が無いと正常に動作しない。
逆に括らなかった場合は括弧をつけてしまうと意図しない動作になる。

下記に示す記述方法はいずれも正常に動作しない例。

// 第2引数のms指定は無視され、即座に関数が呼び出される。
setTimeout(noname(), 1000);
// もはや動作しないパターン。
setTimeout('noname', 1000);

次にnoname()関数に変数を渡したい場合の記述方法。
この際もクオーテーションで括る場合と括らない場合で変数の渡し方に違いがあるので注意。

// 括る場合
setTimeout('noname("first", "second", "third")', 1000);
// 括らない場合
setTimeout(noname, 1000, 'first', 'second', 'third');
↓
[console]
first
second
third 

そして下記は例の如く正常に動作しない。

// 指定の間隔後に関数は呼び出されるが、変数は渡されない。
setTimeout('noname()', 1000, 'first', 'second', 'third');
// 変数は渡され実行もされるが、第2引数が無視されるので即座に呼び出されてしまう。
setTimeout(noname('first', 'second', 'third'), 1000);

見るページごとに書いてあることが違う気がするけど、全てちゃんと実験したので上記の情報は間違いないはず。
※問題児(IE)でもデバッグ済み。

PHPで三項目演算子を入れ子にする方法。

見易さ度外視孤高のワンライナーには必須の文法「三項目演算子」。
さらにこれを入れ子に出来ないかと調べてみたら簡単に出来たのでメモ。

まずはスタンダードな三項目演算子。

$needle = null;
$res = is_null($needle) ? 'null' : 'not null';
var_dump($res);
↓
string(4) "null"

たとえば上記式の評価後に更に条件を分岐させたい場合、参考演算子全体を括弧で括ればひとつの式として正常に評価されるので、入れ子に記述しても全く問題ないのである。

下記例。

$needle = '';
$res = is_null($needle) ? 'null' : (is_string($needle) ? 'string' : 'not string');
var_dump($res);
↓
string(6) "string"

これでワンライナーが更に捗る。

Javascriptではオブジェクトの最終引数後のカンマに注意する。

PHPとかだとよくやってしまいそうなミス。

var obj = {"my":"banana","favorite":"apple","fruit":"orange",}

上記は、最終引数後のカンマを取り除き忘れた際の例。
ブラウザによってはこれが原因でエラーになり処理が中断されるので注意が必要。

例えばjQueryでAjax処理を記述する際。

$.ajax({
	url : url,
	type : 'POST',
	data : data,
})

$.ajax()関数に渡しているオブジェクトに注目。
この場合も同様、最終引数後のカンマが原因となり通信が中断されてしまう可能性がある。
Chromeなどのモダンブラウザは適切に解釈してくれるが、IEは当然のごとくコケるのでくれぐれも注意されたし。

jQueryにてAjaxのコールバックにオブジェクト内の関数を割り当てる。

何かしらのAjaxの処理が完了した際、その場で無名関数をゴリゴリ記述しても動作に問題はないが、どうしても可読性と美しさに欠ける。
そんなときにお勧めなのがこの書き方である。

まずはオブジェクトを宣言し、内部にコールバックで実行したい関数を定義する。

var myFuncs = {};
myFuncs.callback = function(data){
    // 処理
}

今度は同オブジェクト内にAjaxの処理を追加。
そしてコールバック関数のdone()内を以下のように記述する。

myFuncs.ajax = function(){
	$.ajax({
		url: url,
		type: 'POST',
		data: data
	}).done((function(obj){return function(d){obj.callback(d)}})(this));
}

こうすることでオブジェクトmyFuncs内のcallback()関数をAjax完了後の処理として割り当ててることが出来る。
この挙動を説明するためには、Javascriptにおけるthisが何を指しているのかを理解する必要がある。
分かり易いよう、done()のみを取り出すと以下のようになる。

done(
		(function(obj){
			return function(d){
				obj.callback(d)
			}
		})(this)
	);

done()直後のfunction()はこのエントリ←で紹介した文法を用いて関数を記述したもの。
流れとしてはまず、戻り値として関数自体を返却する関数にthis(この場合オブジェクトmyFuncsを指す)を渡し変数objとして受け取る。
次に、Ajaxからの返り値を「d」として受けとり、obj内のcallback()関数にその「d」を渡す関数を記述し、その関数自体を返却(return)する。
こうすることでthisのスコープを上手いこと持ちまわしつつコールバック関数を割り当てる事が出来るので、ソースがめちゃくちゃ綺麗になる。

最初はなかなかピンと来ないが、理解してしまえばかなり便利。

レスポンシブ対応のjQueryスライダーを実装する。

その名も「bxslider」。
シンプルかつ動作もぬるぬるで、レスポンシブ対応の自分的最強プラグイン。

まずは下記の公式サイトから本体をダウンロード。
http://bxslider.com/

落としたら下記のように必要なファイルを読み込む。

<link rel="stylesheet" type="text/css" href="/css/jquery.bxslider.css" />
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="/js/jquery.easing.1.3.js"></script>
<script type="text/javascript" src="/js/jquery.bxslider.min.js"></script>

スライダーにしたい画像を用意し、下記のようにdiv要素、もしくはul要素を使いマークアップする。

<ul class="slider">
    <li><img src="/images/img1.jpg" /></li>
    <li><img src="/images/img2.jpg" /></li>
    <li><img src="/images/img3.jpg" /></li>
</ul>

<div class="slider">
    <div><img src="/images/img1.jpg" /></div>
    <div><img src="/images/img1.jpg" /></div>
    <div><img src="/images/img1.jpg" /></div>
</div>

最後にプラグインを実行する。

$(function(){
	$('.slider').bxSlider({
		auto: true,
		speed: 1000,
		pause: 5000,
		captions: true,
	});
});

bxSlider()に渡せる引数は他にもたくさんあるので、詳細は公式サイトを参照されたし。