基本情報技術者試験を受験しました

結果

まだちゃんとした合格通知は出ていませんが、多分合格しているだろうという感じです。 CBT方式なので受験後すぐにスコアレポートとして結果が送られてきます。
それを見ると、午前が7.5割 午後が8.6割と合格範囲内に入っているのではないかと思います。

なぜ受けようと思ったか

・大学で情報系の学部を出ていないので、一通りのコンピュータサイエンス周りの学習をしたかった
・エンジニアとしてベースの知識を習得したかった

どうだったか

・CBT試験 => 問題用紙の紙に直接メモを書けないので少し苦労した。
・しかし、午前試験、午後試験の間に1週間空いていたので午前が終わった後は午後だけに専念することができた。

どうやって勉強したか

主に下記の基本情報技術者試験ドットコムというサイトを使って勉強しました。 基本情報技術者試験ドットコム

こちらは過去問が網羅されており、また、カテゴリごとで勉強できたのが大変助かりました。

個別の勉強でいうと、
アセンブラkindleの本で読んだり、
アセンブラの解説がされている個人ブログを漁ったりなど色々しました。(末尾に参考なったサイトをいくつか載せています)

難しかったところ

アセンブラです。
午後試験のソフトウェア言語選択で、「Python」か「アセンブラ」でずっと悩んでて、結局10日前ぐらいにアセンブラに決めました。 ギリギリになり焦ってアセンブラの勉強を始めましたが、解答に解説がないこともあり、検索で探すのも少し苦労しました。
最初の方はトレースに時間がかかっていました

しかし、アセンブラを勉強することで、計算処理でのメモリやCPUの動きの概要を知れたり、
ハードウェアの知識も自然とついてきて、他の午後問題の勉強になったりもしました。
この機会じゃないと触れることもなかったと思うので概要を把握したぐらいですが勉強できてよかったと思っています。



参考になったサイト
プログラミングが好き!
宮商定時制計算部
猫先生!?がプログラミングをガリ勉してみた。

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 |
+-----------------+