//tips
//基本情報理解
フェールセーフ:故障の発生や誤った操作をしてもその被害を最低限に抑え、他の正常な部分に影響が及ばないように、全体として安全が保たれるようにする方法
フォールトソフト:異常が発生したとき故障や動作箇所を切り離して、システムを全体的に停止させず、機能が低下してもシステムが稼働し続けられるようにする方法
フォールトアボイダンス:システムを構成する個々の部品に信頼性の高い部品を採用したり、バグの少ないソフトを開発したりして故障が発生しないようにする考え方
フォールトトレランス:障害が発生しても正しく動作し続けられるようにした設計。システムを構成する重要部品を多重化する。
各稼働率をA,Bとすると、直列に繋がれた装置の稼働率は、どちらも稼働に成功するA*B、並列に繋がれた稼働率はどちらかが失敗する確率を全体から引く1-(1-A)*(1-B)で計算できる。
リアルタイムOSなどのマルチタスクを可能とするOSでは、タスク状態をOSが制御して、一定時間ごと、あるいは優先順位にしたがって、強制的にタスクの状態を遷移させる。
この時、強制的に実行状態に遷移させることをディスパッチ、実行状態から実行可能状態に遷移させることをプリエンプションという。
生成されたものは
休止状態→実行可能状態→実行状態→タスク終了による休止状態
とされるのが基本ルートで、他にも
休止状態→実行可能状態→実行状態→割り込みなどの中断による実行可能状態への戻し
休止状態→実行可能状態→実行状態→入出力待ちのものがある場合待ち状態→入出力が完了し実行可能状態
このような操作が含められる。
//shopify/unity
curl_setoptのオプションの確認を続ける。
CURLOPT_SSLVERSIONとは、サーバーによって、curl でhttpsアクセスした時の SSLのバージョンが異なることがあるのでその調整やSSLの上位互換であるTLSへの設定変更を行えるもののよう。
基本的に、この値はデフォルトに任せるのが最適で、下手に2や3を設定すると、SSLv2 および SSLv3 の既知の脆弱性の影響を受けるため、非常に危険なるとのこと。
CURLOPT_USERAGENTは、HTTP リクエストで使用される "User-Agent: " ヘッダの内容。
CURLOPT_CONNECTTIMEOUTは、接続の試行を待ち続ける秒数。基本的には30秒程度が妥当で 0だと、タイムアウトなしという扱いになる。
CURLOPT_TIMEOUTはcURL 関数の実行にかけられる時間の最大値。
これは端末に接続で来たけど情報取得で待たされるという状況で、CURLOPT_CONNECTTIMEOUTの端末に接続する際に待たされる状況の後に発生する。
もし、CURLOPT_TIMEOUTを設定していない状況で、接続が成功したが、映像などの情報取得ができなかったときには、これがないと無制限に待たされることになる。
CURLOPT_CUSTOMREQUESTはメソッド名の指定でGETのときは不要。
$request_headers[] = "";
if (!is_null($token)) $request_headers[] = "X-Shopify-Access-Token: " . $token;
curl_setopt($curl, CURLOPT_HTTPHEADER, $request_headers);
ここではトークンが生成されているとき、HTTPを行う際にそのヘッダーにトークンの項目・内容を追加する処理が書かれている。
http でファイルをアップロードする際に使用します。ファイルを送信するには、ファイル名の先頭に @ をつけてフルパスを指定します
CURLOPT_POSTFIELDSでは、HTTP "POST" で送信するすべてのデータを設定するのでここで、このパラメータは 'para1=val1¶2=val2&...' のように url エンコードされた文字列形式で渡している。 フィールド名をキー、データを値とする配列で渡すこともできるとのこと。
if ($method != 'GET' && in_array($method, array('POST', 'PUT'))) {
if (is_array($query)) $query = http_build_query($query);
curl_setopt ($curl, CURLOPT_POSTFIELDS, $query);
}
ヘッダーにアクセストークンの内容を組み込んだ後にHTTPのPOST処理を実行するURLの準備をしていることがわかる。
// Send request to Shopify and capture any errors
$response = curl_exec($curl);
$error_number = curl_errno($curl);
$error_message = curl_error($curl);
curl_close($curl);
curl_exec();で URL を取得し、ブラウザに渡したら、curl_closeでcURL リソースを閉じ、システムリソースを解放する。
curl_errnoでは直近のエラー番号を返し、curl_errorで直近の cURL 操作に関するエラーメッセージをクリアテキストで返す。
if ($error_number) {
return $error_message;
} else {
もし問題がなければ、HTTPのヘッダーと本文内容を分割して返す。
その際に、preg_splitで文字列を分割して配列にする。
array preg_split ( string $正規表現のパターン , string $入力文字列 [, int $数値 = -1 [, int $flags = 0 ]] )として、正規表現で文字列を分割し、戻り値は配列、3つ目の引数(数値)で、分割する数を指定している。
/\r\n\r\n|\n\n|\r\r/の部分が正規表現。
\nはLF文字(Line Feed)、\rはCR文字(Carriage Return)と呼ばれる制御文字です。
テキストの改行を表現する方法は、システムによって下記3パターンが存在する。
\n(LF):Unix系OS全般、Mac OS X
\r\n(CR+LF):Windows系OS
\r(CR):古いMac OS(9以前)
改行部分を目印にし、文字列を分割している。
$response = preg_split("/\r\n\r\n|\n\n|\r\r/", $response, 2);
形式を整えるため、$headers = array();で初期化した配列を作成。
explode(第一引数,第二引数、第三引数)でヘッダーの中身を分割。
第一引数:区切り文字(例としてスペースやカンマなど)
第二引数:入力文字
第三引数:返される配列の最大の要素の数、最後の配列には分割の残りの文字列が全て含まれる。
// Convert headers into an array
$headers = array();
$header_data = explode("\n",$response[0]);
最初の抜き出しが終わったら、array_shiftを使用して抜き出し部分をオリジナルから削除。
array_shift ( array &$array ):
array_shift() は、array の最初の値を取り出すもので、配列 array は、要素一つ分だけ短くなり、全ての要素は前にずれる。 数値添字の配列のキーはゼロから順に新たに振りなおされるが、 リテラルのキーはそのまま。
$headers['status'] = $header_data[0]; // Does not contain a key, have to explicitly set
array_shift($header_data); // Remove status, we've already set it above
ここではarray_shift($header_data);により$header_data[0]が削除されている。
foreach ( <配列の変数> as <各要素が格納される変数> ) となるので
<?php
$fruits = [ “りんご”, “オレンジ”, “ぶどう” ];
foreach ( $fruits as $fruit ) {
print $fruit. “<br>”;
}
?>
とすると、
りんご
オレンジ
ぶどう
が表示される。
$header_data配列の要素を$partとして扱い、さらに、その$partを:部分で分割する。
foreach($header_data as $part) {
$h = explode(":", $part);
trimは文字列の最初と最後の空白を取り除く関数で" bbb “を"bbb”に修正することができる。
status部分を$headersから削除した分、一個ずらして格納している。
$headers[trim($h[0])] = trim($h[1]);
}
// Return headers and Shopify's response
return array('headers' => $headers, 'response' => $response[1]);
}
}