DateTimeImmutable()のmodifyでの時刻変更がうまくいかなかった

DateTimeImmutable()を使って、下記の処理をやろうとしました。
①… 「秒」の値を 60で割って 「分」へ変換
②… ①で計算した「分」の値をmodifyで時刻($time_to_check)から引く
③… ②で変換した時刻を$time_beforeに代入

しかし、どうやら小数点の計算をさせてしまっていたようでおかしくなりました…汗
($time_beforeが2084年になってしまいました。back to the futureなため正常に動きません…)

「秒」から「分」の換算でfloor()をしたら直りました(;’∀’)
意外と小数点の処理を忘れちゃうので皆さんお気を付けください。


というか、そもそもの話ですが、 最初から時間の単位は統一しておいたほうがいいですね。(この場合なら秒に合わせてmodifyではsecondを使う)
こういう変換はミスにもつながりますし極力回避したほうがいいということがよくわかりました。

非同期で外部ファイルを読み込み、マップ表示速度を上げる


ODINの立案された配送計画の表示の部分(solveVRPResult)でマップの読み込み速度が遅いという問題がありました。
具体的には、ルートと配送先が多数設定されているとそれぞれをマップ上に表示する外部ファイルの読み込みなどに時間がかかっていました。

そこで、asyncまたdeferを活用して非同期で読み込むことで、表示速度を上げるということを試みました。

async・・・読み込み開始は非同期、読み込みが完了したらすぐに実行(script要素の実行順が保証されないので依存関係のあるscript要素はうまくいかなくなるかも)
defer・・・読み込み開始は非同期、読み込みが完了してもすぐには実行せず、DOMツリーの構築が完了してから実行

それぞれの外部ファイルの内容を検証したところ、読み込まれる順番が重要だということがわかりました。
しかし、deferでやってもそこまで速度が改善されず、なんとか全てasyncを使いつつ読み込む順番を工夫することで高速化を図りました。

結果としては、それぞれの読み込み速度と読み込むべき順番を考慮し、
①Mapboxのinitialize
②各ルートの緯度経度のデコード
③各ルートを異なる色の線として描画
③マップ表示範囲の調整
④SVGマーカーなどマーカー類の表示
といったような順序になりました。

また、ファイル内でのコードの順番(どこに呼び出し内容を書くか)というのも速度に影響していました。
HTML→JavaScript(外部ファイル呼び出し、JS処理)
としていたのを
JavaScript(外部ファイル呼び出し)→HTML→JavaScript(JS処理)
と変更しました。

<link rel="stylesheet" href="{$smarty.const.TEMPLATE_URL}templates/css/select2.min.css">
<link rel="stylesheet" href="{$smarty.const.TEMPLATE_URL}templates/css/jsgantt.css">

<script async src="templates/js/mapbox/initializeMapbox.js"></script>
<script async src="templates/js/mapbox/makeVrpResultFestureData.js"></script>
<script async src="templates/js/utils.js"></script>
<script async src="templates/js/decodePathLngLat.js"></script>
<script async src="templates/js/mapbox/addLine.js"></script>
<script async src="templates/js/mapbox/resizeToFit.js" ></script>
<script async src="{$smarty.const.OPEN_LAYERS}"></script>
<script async src="templates/js/error_check.js"></script>
<script async src="templates/js/mapbox/addSvgMarker.js"></script>
<script async src="templates/js/mapbox/addSymbolMarker.js"></script>
<script async src="templates/js/mapbox/addPopup.js"></script>
    
<h1>{$smarty.const.DELIVERY_PLAN_CRATE}</h1>
{include file='route_optimizer/flow_and_status.html'}

...

変数名や関数名を英文に近い表現にして可読性を上げる



変数名やプロパティ名はどのような名前がいいのか色々調べたら、
英文を意識してコードを書くと可読性向上につながるという内容を発見して、そういう命名もありかと思いました。

たとえば、boolean型の変数名またメソッド名は、YesかNoで答えられるような三人称単数現在形の動詞にします。
そうすると、if文と組み合わせたときに読んですぐに意味が分かりやすいです。

class Driver{

 public bool $hasEntered; //配送先エリアに入ったかどうか

 public function sendNotificationWhenHavingEntered(){

  if($this->hasEntered == true){
   sendNotification();
  }

 }

...

関数の引数についても、以下のように英文を意識することができるようです。

name($user, '山田太郎');

name A B.(AにBと名付ける)ですね。
ちょっとこの例は単純ですが、こういったように引数の順番など少しずつ考慮することで可読性も少しずつ上がっていくような気がしました。

Amazon S3(AWS)でExcelファイルが開かずにブラウザで文字列での表示になってしまう

せっかくデータベースのデータを抽出してExcelファイルを作成することができたのに、ファイルリンクを踏んでもExcelファイルとしてダウンロードにならずやや焦りました。ググってもそれらしき内容が出てこなく時間を取られてしまいました。
メタデータの Content-Disposition を設定すればよいようです。PHPファイル上では、インスタンス生成後に$s3client->putObject()内で、’ContentDisposition’ => ‘attachment’を追加したらうまくいきました。

  // S3clientのインスタンス生成
    $s3client = new Aws\S3\S3Client([
        'credentials' => [
            'key' => AWS_ACCESS_KEY,
            'secret' => AWS_SECRET_ACCESS_KEY
        ],
        'region' => 'ap-northeast-1',
        'version' => 'latest'
    ]);
    
    try {
        $s3client_CSV_upload = $s3client->putObject([
            'ACL' => 'public-read',
            'Bucket' => AWS_S3_BUCKET_NAME,
            'Key' => $upload_file['file_name'],
            'SourceFile' => $upload_file['file_path'],
            'ContentType' => mime_content_type($upload_file['file_path']),
            'ContentDisposition' => 'attachment'
        ]);
        
        // アップロードファイルのURL取得
        $results['upload_name'] = $s3client_CSV_upload['ObjectURL'];
        $results['result'] = 'SUCCESS';
    } catch (Exception $e) {
        $results['result'] = 'UPLOAD_ERROR';
        errorLog($e);
    }

Smartyの定数をJavaScriptメソッドで処理する

Smarty定数をJavaScriptのメソッドで処理して表示させたいのにできない!という状態に陥りました。
scriptタグのdata属性にSmartyの値を入れてみたのですが、文言の定数のためか上手く文言が表示されず…

最終的には、一度メソッド内に変数をつくって、そこにSmarty定数を代入するという方法に落ち着きました。以下が手順です。

手順
① Smartyの定数を代入するためのJavaScript変数を作成
② {/literal} と{literal} を使ってJavaScriptを外した状態でSmarty定数を記述
③ ②のsmarty定数を①の変数に代入

{literal}
 <script type="text/javascript">
  function check(){
   var delete_move = "{/literal}{$smarty.const.DELETE_MOVE}{literal}";
   return confirm(delete_move);
  }
 </script>
{/literal}

<a href="index.php?action=record_delete" {literal}onclick="return check()"{/literal}>
 {$smarty.const.COMMON_DELETE}
</a>