【2021/06/07】今日の学習

バイナリファイルとは

特定の文字コードの範囲に収まらない任意のビット列を含む、バイナリデータを保存したファイル。
バイナリデータとは、コンピュータが読むことが前提となっているデータのことで、テキストファイル( .txt) 以外のファイルはすべてバイナリファイルであり、実行形式のプログラム、画像、音声、動画などのファイルが該当する。
テキストファイルであれば、テキストエディタなどで表示して、中身を見たり編集したりすることができるが、バイナリファイルは、その形式に対応したソフトウェアでなければ見られない。

[PHP] sprintf( ) フォーマットされた文字列を返す

sprintf( '文字列', $変数, ・・・ );

例えば、SQL文やコマンドは文字列で書く。
この中に、ユーザー名、パスワード、あるいはその他変数にしたものを入れたいとき、文字列エスケープで ' . $変数 . ' で繋ぐのはスマートじゃない。

そこで、sprintf()を使って文字列に変数を入れる。⇢ フォーマットされて文字列で返す。
例)

$num = 10;
$location = animal;
$format = ' The %2$s contains %1$s monkeys '  ←文字列
sprintf( $format, $num, $location);
→/// The animal contains 10 monkeys

[PHP] exec()を使ったコマンド実行

$command = ' 文字列 ';

$output = null;
$result = null;

exec( $command, $output, $result );

第2、第3引数に変数を置いておくと、結果を返してくれる。
コマンド実行結果→$output Array(0)
正しく実行されたときは0→$result int(0)

パーミッションとは「権限・許可」のこと

⇢ファイルやフォルダへのアクセス権

[誰に]

自分、自分が属するグループ、全員
"rwx , --- , r-x"

[どんな]

r : 読み込み
w: 書き込み
x: 実行(execute)

【2021/06/01】今日の学習

dumpファイル 拡張子「.dmp」

ここでは、バックアップやシステム移転のために、ある瞬間のデータベースの内容をまるごと複製したファイルのこと。

データが失われた際に、ダンプファイルからデータベースを復元することができる。
機材の更新のときとかも、古いシステムで取ったダンプファイルを新しいシステムでリストアすることで、円滑にデータベースを移転することができる。
リストアとはバックアップの対義語で、リカバリー(復元、復旧)的な意味合い

MySQLでダンプファイルを作成する

MySQLのdumpには「 mysqldump 」を使う。
一般的にMySQLサーバにログインするとき、コマンドで

mysql -u root -p

とするが、
mysqldumpはMySQLにログインして動かすツールではない

mysqldump -u ユーザー名 -p データベース名 > 出力ファイル名

ちなみに、作成されたdumpファイルは、元のデータベースにあったテーブルを作り直すためのコマンド(SQL文)が記載してあるファイルである。

データベースから特定のカラムを持つテーブルを検索する

データベースにはたくさんテーブルがある。
それらすべてのテーブルから特定のカラムを持ったテーブルだけ取り出したい。

mysql> SELECT table_name, column_name
  FROM information_schema.columns
  WHERE column_name = " 検索したいカラム名 ";
  AND table_schema = " 検索対象のデータベース名 ";

関係ないけど用語の意味調べついでに出てきたストアドプロシージャについてメモがてら

ストアドプロシージャとは、データベース上での一連の処理のまとまりのことで、関数みたいなもの。
一連の手続きをコンパイルして一つにまとめ、データベースサーバに保存したオブジェクトで、呼び出して使える。
条件分岐や繰り返し処理も可能になる。

ストアドプロシージャのメリット
パフォーマンス

埋め込みSQLの場合は、「データの検索」と「データの更新」を行うには、計二回のデータベースサーバとの通信を行う必要がある。
対してストアドプロシージャは、検索、判定、更新をひとまとめにしているため、データベースサーバとの通信が一回ですむ。

保守性

ストアドプロシージャは、データベースに対する処理をアプリケーションから隔離できるため、ビジネスロジックへの変更対応がしやすく、アプリケーションの保守性が向上する。

セキュリティ

ユーザーぼデータベースアクセスをストアドプロシージャのみに限定することで、不用意なデータ操作を防ぐ。

【2021/05/31】今日の学習

CakePHP】 QueryBuilder と ConnectionManager

CakePHPでは、データベース接続に2つの方法がある。それが、

  • QueryBuilder(クエリビルダ)
  • ConnectionManager

これらは、
データベースから取り出してきたデータの形式が異なるので注意。

QueryBuilderでは、Queryインスタンスを利用してデータベースにアクセスし、エンティティクラスのインスタンスとして取り出す →オブジェクト型

ConnectionManagerを使って直接SQLを発行する場合は、配列でデータを受け取る。配列内に保管されているレコードも連想配列になっている。→配列の型

SQL】 日付を加工する

  • DATEDIFF ・・・日付の差分を取る
    例)
mysql>  SELECT DATADIFF(' 2021-12-31 ', ' 2021-12-30 ' ) ;
          → 1
      SELECT DATADIFF(' 2021-11-30 ', ' 2021-12-31 ' ) ;
          → - 31

以上の例を元に、例えば、最終変更日時から半年以上経過しているかどうかを知りたいとき、
最終更新日をMAX(update_date)とすると

mysql>  SELECT DATADIFF( MAX(update_date), '現在日時 − 6ヶ月')  <= 0 ;

ということになる。

  • DATE_ADD(加算)
  • DATE_SUB(減算) より、' 現在日時 − 6ヶ月 'を取るには、
DATE_SUB( ' 現在日時 ', INTERVAL 6 MONTH) ;
もしくは、
DATE_ADD( ' 現在日時 ', INTERVAL - 6 MONTH) ;

基本的に日時は文字列になるが、加工や比較のときは型に注意すること。

今日はここまで。 毎日少しずつ、かつ学びたてほやほやの内容が多いので、大事なとこ抜けてたり、普通に間違ってたり、断片的な知識メモしか書いてなかったりするから、誤認識の修正や追記が随時必要。

【2021/05/30】今日の学習

バリデーション [ BuildRules ]

※BuildRules(ビルドルール)では、1つずつデータをチェックする。複数レコードが登録されるとき、毎回データベースに接続しに行ってしまうので、大量のデータを処理するには向いてない。

条件付きルールを使う

エンティティデータに基づいてバリデーションをかける条件を指定できる。

public function buildRules ( RulesChecker $rules )
{
    $rules->add( function ($entity, $optionValidate) use($rules) {
        if ( $entity->delete_flag === 0 ) {
            $rule = $rules->isUnique( [ 'name', 'delete_flag' ] , " 表示するエラーメッセージ ");
            return $rule($entity, $optionValidate );
        }
        return true;
    }, ' バリデーションの名前 ' );

    return $rules  /// 最終的に返す値は$rules
}

上の例は、delete_flag === 0 のとき(つまり削除されていない有効な値がDBに存在する)
同じnameはisUniqueに引っかかり登録できない。
もし、delete_flag === 1 (値が削除されている)なら、登録できる。

比較演算子( == と === の違い )

PHPマニュアルより

  • $a == $b ( 型の相互変換したあとで、その$aが$bに等しいときTrue )

  • $a === $b ( $aが$bに等しく、同じ型である場合True )

キャストとは

変数などのデータ型を変換すること
PHPには自動キャストという機能があり、異なる型同士で演算をすると型を自動で変換する

== (自動キャストする)は型の相互変換を行うため、$a(string型)と$b(int型)でも比較できる。
=== (自動キャストしない)は型の変換を行わず、同じ型で$aと$bが等しいときだけ比較できる。

!= や !== についても同様

だから、=== の方が厳格とされる。

キャスト演算子

PHPは弱い型付けの言語とされている。
ある値を特定の型として扱いたいとき、キャスト演算子を使うと、その値を特定の型として扱うことができる。

  • ( int ) → 整数
  • ( string ) → 文字列
  • ( bool ) → 真偽値
  • ( array ) → 配列
  • ( object ) → オブジェクト
  • ( unset ) → NULL

$a = ' 5 ' ;
$a = ( int ) $a ;  // これで$aは整数値となる

ただし、配列を文字列にキャストした場合の結果は"Array"となる。
また、オブジェクトを配列にキャストすると、そのプロパティの名前と値を関連付けた連想配列となる。
配列をオブジェクトにキャストすると、配列のキーがオブジェクトのプロパティとなる。

PHPにおける変数

値が設定されていない変数は、NULL値が設定されていると見なされる。

変数の参照

PHPにおける「参照」とは、その変数のエイリアスを作ること。
エイリアスとは「あだ名」「別名」のこと
ある対象や実体を、複数の異なるシンボルや識別子で同じように参照できるようにする仕組み。

$blackを変数$whiteのエイリアスとして設定するには、参照したい変数の前に&をつける。

$black = & $white ;

$blackにそれまで保存されていた値がもしあれば、それは破壊され(失われ)、$blackは$whiteに保存されている値のエイリアスとなる。

$white = " snow " ;
$black = & $white ;
unset ($white)  // 参照の解除
echo $black ;
→/// snow

【2021/05/27】今日の学習

Javascript【スコープ】

  • グローバルスコープ
    scriptタグ内の最も外側エリア、windowオブジェクト直下
  • ローカルスコープ(関数スコープ/ブロックスコープ)
    文字通り、関数内に存在するスコープとブロック内に存在するスコープ

function saveConfirm ( ) {
  if ( id === null ) {
    const mode = 1;
    const id = $data['id'];
  } else {
    const mode = 2;
    const name = " きよし ";
  }
}

function saveConfirm ( ) { }内は関数スコープ範囲

上記コードは間違っている。
Javascriptでは、if文にはブロックスコープは存在しない。

同一ブロック内でのconst再定義・再代入は❌

constやletは初期値を設置するイメージなのかなと。

CakePHP データ更新 (patchEntity)

// 削除処理
$article = $this->Articles->get( id ); ← idによって更新したいデータをテーブルから取得
$this->Articles->patchEntity ( $article, [
    ' name ' => ' きょろ ',
    ' book_title ' => $newTitle
  ]
$this->Articles->save($article);

また、バリデーションやアソシエーションを指定するときは、

$article = $this->Articles->get( id ); ← idによって更新したいデータをテーブルから取得
$this->Articles->patchEntity ( $article, $this->request->getData( ), [
    ' validate ' => ' editCustom ', ←バリデーション指定
    ' associated ' => [ ' User ' , 
        ' Comments.posts ' => [ ' validate ' => ' signUp '] 
     ]
  ]);
$this->Articles->save($article);

PHPで日付を比較する

関数を使う

  • time( ) ・・・ 現在のUNIXタイムスタンプ
  • date( ) ・・・ フォーマットを指定して日付の文字列
  • strtotime( ) ・・・ 日付表現をUNIXタイムスタンプに変換して返す

    UNIXタイムスタンプとは、1970年1月1日から経過した秒数のことで、変換して年月日などの見やすい表現にもできる。

strtotime(' now '); →///  1583209562

日付の比較をするのであれば、

$time1 = strtotime(' 2021-04-01 ');
$time2 = strtotime(' 2020-04-01 ');
($time1 - $time2) / (60 * 60 * 24);

→/// 365



DateTimeクラスを使う方法

$time = new DateTime( ); インスタンス生成
$time->format(' y-m-d '); フォーマット指定

→/// 2021-04-01



書きながら感じたことメモ
それぞれもっと派生させていくこと、もっと詳しく調べて具体的な使い方や使い分けの意図などまで学習の広さと深さを追うこと。

【PHP】オブジェクトと連想配列

大事なこと

取得したデータや送信するデータ、$変数の中に入っているデータの「型」を意識する。
初期値を置くときや、空の入れものを用意するときも、
数値なのか、文字列なのか、配列なのか、オブジェクトなのかを考える。

オブジェクト

class object {
  public $name = "きよし";
  public $fruit = "りんご";
}
特徴
  • { } で囲われている
  • 変数(プロパティ)や関数(メソッド)が入る
  • 末尾に「;」がつく
取り出し方
オブジェクトはnewでインスタンス化(実体化)
$objectType = new Object();
$objectType->name;



連想配列

$array = [
  "id" => 100,
  "name" => "きよし"
];
特徴
  • [ ] で囲われている
  • $keyと$valueがセットのキーバリューセット
  • => (アロー演算子)
取り出し方
$array["name"]



cakePHPではデータベースから取り出したデータがエンティティのオブジェクトになっている。 オブジェクトを連想配列に変換して、データを操作しやすくしたり、配列に対するメソッドを使えるようにしたりと工夫が必要。

foreachのループの中で値を変更する

  • foreach ( 配列 as $value )
  • foreach ( 配列 as $key => $value )

概要

foreachは値渡しなので、要素の変更が反映されない。

要素を参照渡しにすると変更ができる。
  要素($value)の前に「&」をつける

ただし、ループ終了直後にunset()が必要。

雛形
foreach ($array as &$value){
    $valueの変更処理
 (データの代入、定義など)
}
unset($value)

☆ループの中で配列の要素を直接変更する場合は、$valueの前に「&」をつける
unset()で要素($value)の参照を解除しておく。 でないと、foreachのループを終えたあとも$arrayは配列の最後の要素を参照したままになる。