PHP クイックソート

基本情報で出てきた問題

平成27年春期 データ構造とアルゴリズム
・問題にあるプログラムをPHPのコードにしてみた

PHPで書いてみた

<?php

$array = [5,3,6,4,7,2,1]; //任意の配列
$K = 4; //何番目の値を取りたいか

//標準入力を使いたい場合上記をコメントアウトして、書き部分をコメントアウト外す
// $array = explode(",", trim(fgets(STDIN))); //カンマ区切りで入力する
// foreach($array as $v){
//     if(!is_numeric($v)) {
//         echo '数値以外が含まれています';exit;
//     }
// }
// $K = trim(fgets(STDIN)); //何番目の値を出力したいか
// if(!is_numeric($K) || $K <= 0 || $K > count($array)){
//     echo '範囲外です';exit;
// }


$n = count($array);
$top = 0;
$last = $n-1;
$k = $K-1;

$ans = quicksort($array, $k, $top, $last);
echo $ans;

function quicksort($array, $k, $top, $last){
    while($top < $last){
        $pivot = $array[$k];
        $i = $top;
        $j = $last;
        while(true){
            while($array[$i] < $pivot){
                $i++;
            }
            while($pivot < $array[$j]){
                $j--;
            }
            if($i >= $j){
                break;
            }
            $work = $array[$i];
            $array[$i] = $array[$j];
            $array[$j] = $work;
            $i++;
            $j--;
        }
        if($i <= $k){
            $top = $j + 1;
        }
        if($k <= $j){
            $last = $i - 1;
        }
    }
    return $array[$k];
}


感想

・今回は値を出力しただけだが、並び替えられた配列を取得したりもできそう
・標準入力を使った場合を入れてみた

テスト自動化ツール Katalon Recorderが手軽に試せた

インストール

下記でchromeの拡張に追加できる。
Katalon Recorder (Selenium tests generator) - Chrome ウェブストア

使いたかった理由

・画面テストを効率よくするため。(フォームの自動入力などを様々なパターンで試したかったため。)
・画像、動画を10件、50件、100件登録するテストがあり、手動でやったら手間がかかるため自動化したかった。


f:id:maruko1022:20210907103841p:plain

他に試したテストツール

・cypress.io
Selenium

続きを読む

PHPでYoutubeAPIを利用して、特定チャンネルの動画から高評価数と低評価数などを取得してみた

目次

・やったこと、結果
・利用したもの、なぜ試したか
・準備すること、実装コード(後にそれぞれ説明)、注意すること

やったこと、結果

・YoutubeAPIを使用
① 特定のチャンネルの動画一覧からキーワードを指定してキーワードに一致する動画一覧を取得
② ①で取得した動画一覧の各動画詳細を取得
・取得した値 → 「投稿日,タイトル,高評価数,低評価数,サムネイル」

実行結果↓

3件
投稿日: 2021-08-18
タイトル: しずる池田とフルーツポンチ村上のアーバンブルーラジオ「池田のマネージャーはアーバンブルーラジオをよく思ってない?」の回
リンク: https://www.youtube.com/watch?v=EpVk_gzJ1vQ
高評価: 330
低評価: 330
サムネイル: https://i.ytimg.com/vi/EpVk_gzJ1vQ/default.jpg

投稿日: 2021-08-11
タイトル: しずる池田とフルーツポンチ村上のアーバンブルーラジオ「心は沖縄」の回
リンク: https://www.youtube.com/watch?v=5ix_CRJirHs
高評価: 462
低評価: 463
サムネイル: https://i.ytimg.com/vi/5ix_CRJirHs/default.jpg

投稿日: 2021-08-04
タイトル: しずる池田とフルーツポンチ村上のアーバンブルーラジオ「ヒザ神はスポーツ観戦がお好き」の回
リンク: https://www.youtube.com/watch?v=yJf0xZrF_oU
高評価: 450
低評価: 450
サムネイル: https://i.ytimg.com/vi/yJf0xZrF_oU/default.jpg
続きを読む

画像トリミングで cropper.js を使用した概要と感想

ドキュメント
GitHub - fengyuanchen/cropperjs: JavaScript image cropper.
参考サイト
Cropper.jsを使ってみる | cly7796.net

上記サイトは、オプションを使う使わないのそれぞれ違いがサンプルで見れるので良いです。

コード(概要)

const cropper = new Cropper(image, { //image:トリミングする画像
         //オプション
});

//選択した範囲のHTMLCanvasElement返します。(getCroppedCanvasはcropper.jsのメソッド). 
const    変数1 = cropper.getCroppedCanvas();  
const    変数2 = 変数1.toDataURL();//data URI を返す. 
変数2.toBlob(function(blob){
 const 変数3 = new FormData(); // FormData作成
 変数3.append('blob', blob); //blob追加

 //ajaxで送信
});

参考:
HTMLCanvasElement.toDataURL() - Web API | MDN
HTMLCanvasElement.toBlob() - Web API | MDN



感想:
トリミングされた画像を受け取ってアップロードしたり、DBに格納するサーバ側の処理も書いているが、JSで色々調べて触ることが多かった。
・トリミング後のプレビュー表示
・バリデーションとしての拡張子チェックやバイナリデータチェック
・toBlob、toDataURL、FormDataやcropper.jsのメソッドなど、知ることが増えつつ、調べながら試していけて楽しかった。

PCでトリミングする時にcropper.jsを使うのはいいが、スマホ(PCでも)では「croppie」が良さそうだと感じた。
大きく違うところは、画像選択してトリミングする範囲を決めるときに範囲移動の動かし方。 例えば、cropper.jsでは右に動かしたとすると、トリミングする範囲が右に動く。
対して、croppieは、右に動かしたとすると、画像自体が右に動き、トリミングする範囲は固定されている。
twitterやLineのプロフィール変更ではcroppieの動きのようになっているのでスマホであればこちらが使いやすいかもと思った。
しかし、今回の自分の仕様要件を満たすためには、cropper.jsが最適だと思ったのでこちらを選んだ。

Croppie - a simple javascript image cropper - Foliotek

fuelphp cvタグ 先頭と末尾にダブルクォーテーションがついていて発火されない(自動エンコーディングされている)

cvタグがエンコードされている.

結論

viewに渡す際の第3引数をfalseにする→forge('ファイル名','データ',false)).

forge($file = null, $data = null, $filter = null)

対応の流れ↓

修正前

onmousedown=""javascript:ga('send','event',"~~");""

開発者モードでHTMLを見てみると上記のようなjavascriptの前と末尾が「""」で括られていた。
一般的にfuelのcontrollerからviewオブジェクトを作る際、forge(ファイル名,データ,true or false)で渡すと思うが、
この第3引数をtrueにするかfalseにするかで自動エンコードされるか決まるそう。
config/app/config.phpに書かれている内容がこの第3引数のデフォルト値になる。
多くはtrueがデフォルトだと思われる.


しかし、controllerからviewに渡す際の第3引数をfalseにしてしまうと、view全体の自動エンコーディングがfalseになってしまう。
自分の場合は、バナーを出す際のcvタグだったので、バナーを出す時に別のファイルを呼んでおりその部分でのみ第3引数をfalseにする。(controller=>view=>バナーのviewファイル). なので、controllerから全体のviewに渡す際はset_safeでビューに変数を割り当て、そこから該当のバナー画像が置いてあるファイルにのみ、第3引数でfalseにしたほうが良さそうと思った。

set_safe($key, $value = null). デフォルトで出力時に変数のエンコーディングを行わないこと以外は、set() と同じです。

参考:

View - クラス - FuelPHP ドキュメント

mysql update デッドロック whereの条件をプライマリキーにする

mysqlのupdateでデッドロックが起こっていました。
他のsqlと絡む処理の時に起こっていたようです。

結論. ロックの行数を少なくすることで解決. updateする前にselectでプライマリキーを取得し、 それを使い、絞り込む際の条件をプライマリキーにすることにより、
ロックの行数を1つに減らすことで対処.

修正前.

update テーブル名 set ~~ where カラム = インデックスなしのカラム;
mysql> SELECT trx_rows_locked FROM information_schema.INNODB_TRX;
+-----------------+
| trx_rows_locked |
+-----------------+
|             135 |
+-----------------+

修正後.

select プライマリキー from テーブル名 where ~~;(プライマリキーを取得)
update テーブル名 set ~~ where カラム = プライマリキー;
mysql> SELECT trx_rows_locked FROM information_schema.INNODB_TRX;
+-----------------+
| trx_rows_locked |
+-----------------+
|               1 |
+-----------------+

mysql delete文 スロークエリ

原因
おそらくwhereで指定しているカラムの絞り込み時、に時間がかかっていた。
参考:【SQL】DELETE文が遅いときのチューニング方法 | SE日記.

スロークエリの時の状態. このような状態でupdated_atをwhereの条件としていて、件数が多い、updated_atにインデックスがないのが原因と考えられる。

delete from テーブル名 where updated_at < '特定の日付';

なので、プライマリーキーであるidをwhereの条件として指定する. プライマリキーは作られた時点で一意制約なので、計算量としてももっとも早い. 改善版.

delete from テーブル名 where id in (idのリスト);