エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

Laravel5.2以降で二重配列にバリデーションを入れる方法【117日目】

配列にバリデーションをかけたい

arrayX = [['key' => 10], ['key' => 'aaa']]

こんな感じのやつ。

arrayのkeyに対して、数値であるとバリデーションをかけたいやつですね。

公式ドキュメント

バリデーション 5.3 Laravel

配列形式のフィールドをバリデーションする場合は、*文字を使用し、各配列要素の全メッセージを取得できます。

結論

'arrayX.*.key' => 'integer'

なにこれ?

array(配列)
*(全てのキーの要素(一層目))
key(keyというキーの要素(二層目))

わかれば簡単!(わからなかった)

日記

はてなブログのエンジニアグループに入ってみました。

エンジニアの先輩、初心者エンジニア仲間を探したいですけど、なかなか難しいですね。

ひとまず少しずつ勉強していきましょー!

PHPで擬似乱数を作ってみよう【109日目】

擬似乱数を作ってみよう!

ってことで、すっごく簡単に作ってみよう。

アクセスする時間に応じて、数値を返せば実質乱数じゃね?ってことでプログラム。

<?php
    echo randsan();

    function randsan() {
        echo (microtime() * 100) % 101;
    }

はいかんせー!

でも問題が・・・

でもこれ、0.001秒より早いスピードでアクセスされると、同じ数値が出てしまう・・・

<?php
    for($i = 0; $i < 20; $i++) {
        echo randsan();
    }

    function randsan() {
        echo (microtime() * 100) % 101;
    }

これとかね。

なら、アクセス回数の要素も付け加えよう!

擬似乱数

<?php
    for($i = 0; $i < 20; $i++) {
        echo (randsan() . PHP_EOL);
    }

    //時間と回数の2変数で作る
    function randsan($count = 0) {
        if(isset($GLOBALS["randsan"])) {
            // 素数を足しただけで1でもいいです
            $GLOBALS["randsan"] += 13;
            $GLOBALS["randsan"] %= 100;
        } else {
            $GLOBALS["randsan"] = 0;
        }
        echo ((microtime() * 100) + $GLOBALS["randsan"]) % 101;
    }

これでアクセスする度に違うしバッチリだね!

でもこれにも問題が・・・

これ、同じプログラムを、同時に別のPCで実行したら同じ乱数の値が出るよね・・・

じゃあIPで制限する・・・?あれ・・・?これ無限に無理じゃね・・・?

だから擬似乱数

ってことで、ソフトウェアで完璧な乱数とか無理じゃねっていうお話。

だから擬似乱数って呼ばれるんですね。

ちなみに、先輩からハードウェア乱数生成器なるワードをいただきました。
気になる方は調べてみてくださいね。

日記

また1つ課題を消化。
いろんな学びあるの良いこと。

そして昨日の課題、なんでクラス化するの問題が。。。
オブジェクトにするなら、ハノイの塔の配列、移動、表示までのクラスにすればよかった。
ハノイの塔を解くのはまた別のお話ですね。

なんにしても、なぜクラス化するの?どんなオブジェクトを作るの?
っていうのは、いっぱい作っていかなきゃ、慣れない気がします。

1の課題でいろんな気付きをいただけるから、本当に先輩方には感謝なのです・・・!

PHPでハノイの塔のプログラム!【108日目】

苦節3日、無事に出来上がりました。

むしろ3日かかったのかお前っていう。

寝て起きてシャワーを浴びてを2回繰り返したらプログラム出来ました。

注意。

いないと思いますが、このプログラム出来が良くないので、これをコピーしてプログラミング課題の提出に使うのは、
やめておいた方がいいですよ\(^o^)/

まあ、学生感あふれるコードですが・・・w

コード

<?php
    if (count($argv) > 1 && $argv[1] > 0) {
        $max_tower_number = $argv[1];
    } else {
        $max_tower_number = 3;
    }
    $hanoi = new Hanoi($max_tower_number);
    $hanoi->showTower();
    //スタート位置を0、ゴールの位置を2とする
    $hanoi->solveHanoi($max_tower_number, 0, 2, 1);

    class Hanoi
    {
        //塔を格納する変数
        private $tower = [[], [], []];

        //塔を設定する
        public function __construct($max_tower_number = null)
        {
            if ($max_tower_number == null) {
                $this->tower = [[1,2,3], [], []];
            } else {
                for ($i = 1; $i <= $max_tower_number; $i++) {
                    array_push($this->tower[0], $i);
                }
            }
        }

        //ハノイの塔を解く
        public function solveHanoi($tower_height, $start, $goal, $temp)
        {
            if ($tower_height > 1) {
                //ベースの上の塔を、目的の場所から別な場所に避難させる
                $this->solveHanoi($tower_height - 1, $start, $temp, $goal);
            }
            //N+1のベースをゴールに移動する
            $this->move($start, $goal);
            if ($tower_height > 1) {
                //別な場所に避難した塔をゴールに戻す
                $this->solveHanoi($tower_height - 1, $temp, $goal, $start);
            }
        }

        //ブロックの移動
        public function move($start, $goal)
        {
            try {
                //入力値のチェック
                if ($start >= count($this->tower)) {
                    throw new Exception("移動元が不正な値です");
                }
                if ($goal >= count($this->tower)) {
                    throw new Exception("移動先が不正な値です");
                }

                //ブロックを取り出す
                if (count($this->tower[$start]) === 0) {
                    throw new Exception("移動元が空なので移動できません");
                }
                $item = array_shift($this->tower[$start]);

                //ブロックの移動(ルールを確認する)
                if (count($this->tower[$goal]) > 0) {
                    if ($this->tower[$goal][0] < $item) {
                        array_unshift($this->tower[$start], $item);
                        throw new Exception("移動先が" . $this->tower[$goal][0] . "なので" . $item . "は移動できません");
                    }
                }
                array_unshift($this->tower[$goal], $item);

                //動かしたブロックと、移動元移動先を表示
                //合わせて塔も表示
                print("number:" . $item .  " move:" . $start . "->" . $goal . PHP_EOL);
                $this->showTower();

            } catch (Exception $e) {
                print("例外キャッチ:" . $e->getMessage() . PHP_EOL);
                exit(1);
            }
        }

        //塔の表示
        public function showTower()
        {
            print('-----------------------' . PHP_EOL);
            foreach ($this->tower as $items) {
                foreach ($items as $item) {
                    print("[" . $item . "]");
                }
                print(PHP_EOL);
            }
            print('-----------------------' . PHP_EOL);
        }
    }

実行結果

f:id:willow710kut:20180129204957g:plain

補足

インスタンス化する時に数値を渡せば、コンストラクタで値に応じた塔を作ってくれます。

また、move()showTower()はpublicにしてあるので、エラーとか試したい方は、 テキトーにコードをいじっていただければ!

日記

めっちゃ時間かかりましたが、無事に作成完了!

久々に頭回しまくって楽しかったです!

ただ、シャワー浴びた瞬間にひらめく辺り、
私の頭には『キャッシュ』がたまって、パフォーマンスが落ちるという性質がある可能性が・・・w

この課題、明日〆切だったから、それまでに作成出来てよかった・・・!満足!

さあまた明日の課題頑張るぞー!

【PHP】参照渡しと破壊的な関数とは。【103日目】

クイズ

swapは2つの値を入れ替える関数です。
swapを実行した後の$x,$yの値は?

例のプログラム

$x = 1;
$y = 2;

swap($x, $y);
echo $x;
echo $y;

swap2($x, $y);
echo $x;
echo $y;

function swap($a, $b)
{
  $temp = $a;
  $a = $b;
  $b = $temp;
}

function swap2(&$a, &$b)
{
  $temp = $a;
  $a = $b;
  $b = $temp;
}

実行結果

f:id:willow710kut:20180124224742g:plain

どういうこと?

swap($x, $y);は、
function swap($a, $b)の$aに$x(=1)、$bに$y(=2)の値をコピーしているだけ。

だから、関数を実行した後も$xと$yの数値が変わらない。

swap2($x, $y);は、
function swap2(&$a, &$b)に変数そのものを渡している。 &$aは$xになり、&$bは$yになる。

従って、$xと$yの値がswap2の後に入れ替わっている。

&$aのような書き方を『参照渡し』と言い、 実行後に変数が書き換わるような関数を『破壊的な関数』と言う。

日記

シンボルテーブルについての説明は省略。

gifを使ってみましたが、見やすいでしょうか。

良さそうならこんな感じの記事を増やしたいところ。

このPHPのコードのメモリの扱いがわからない。【101日目】

問題のプログラム

php > echo memory_get_usage();
350552
php > class A {
php { public $number = 10;
php { }
php > echo memory_get_usage();
351040
php > $a = new A();
php > echo memory_get_usage();
351096
php > $b = new A();
php > echo memory_get_usage();
351184
php > $a->number = 12;
php > echo memory_get_usage();
351696
php > $b->number = 11;
php > echo memory_get_usage();
351696
php > echo $a->number;
12
php > echo $b->number;
11

ここはわかる

php > $a = new A();
php > echo memory_get_usage();
351096
php > $b = new A();
php > echo memory_get_usage();
351184
php > $a->number = 12;
php > echo memory_get_usage();
351696

インスタンス生成した時点ではclassのコピー扱いなのかな、$a->number = 12;で値を変えることでコピーとして扱えないから、新たにメモリにclassAのコピーを展開するからメモリが増えると予測は出来る

でもこれがわからん

php > $a->number = 12;
php > echo memory_get_usage();
351696
php > $b->number = 11;
php > echo memory_get_usage();
351696

なぜ増えない・・・$a$bは異なる変数のはずなのに・・・

日記

PHPについていっぱいお勉強する週間。

シンボリックテーブルとか、参照渡しとかいろいろ勉強した。

参考サイトが出たらまた記事にまとめたいところ。

ただ、これが解決しないと、理解が出来たと言えない・・・なんだこれ・・・

PHPの参照渡しのメモ【99日目】

参照サイト

PHP: リファレンスとは? - Manual

PHP: リファレンス渡し - Manual

伝える内容候補

極力参照渡しでメソッド作らない方が良い
普通のメソッドは、値を直接書き換えてるわけじゃないよ。コピーを使ってるんだよ。
メモリの存在←ここまで説明するとなると骨が折れる気がする

参照渡しを使うとどうなるか

引数に渡した変数の値が変更される。

使う側が予想していない値に変わる可能性がある。

普通の関数との違い

参照渡しするメソッドは、破壊的なメソッドと呼ばれる

function swap($a, $b)
{
  $temp = $a;
  $a = $b;
  $b = $temp;
}
function swap2(&$a, &$b)
{
  $temp = $a;
  $a = $b;
  $b = $temp;
}

2つの違いは、メソッドを実行した後、使用した変数が変化していること

普通のメソッドの場合

$x = 1;
$y = 2;

swap($x, $y);
echo $x;
echo $y;

1,2の順で表示されて、$xと$yの値は変更されない。

$x = 1;
$y = 2;

swap2($x, $y);
echo $x;
echo $y;

2、1の順で表示されて、数値が入れ替わっているのがわかる。

日記

来週会社で説明する予定の参照渡しについて。

何を説明しなきゃいけないか、がまとまらない。

説明したい内容が固まれば、それに合わせて説明の内容が変わるので、それをよく考えなきゃ。

今の所

PHPの$a=$bが、$aをreturnしているのを調べよう【97日目】

導入のきっかけ

willow710kut.hatenablog.com

なので、=が関数なら、何をreturnしてるか調べようってお話

書いたプログラム

$a = 0;
var_dump($a);
var_dump($b);
var_dump($a = $b);
var_dump($a);
var_dump($b);
var_dump($a = $a);
var_dump($a = $b = $c);

実行結果

php -a使って確認。php7.0です。

見にくいので改行入れました。

php > $a = 0;

php > var_dump($a);
int(0)

php > var_dump($a = $b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

php > var_dump($a);
NULL

php > var_dump($b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

php > $a = $b;
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1

php > var_dump($a = $a);
NULL

php > var_dump($a = $b = $c);
PHP Notice:  Undefined variable: c in php shell code on line 1
Notice: Undefined variable: c in php shell code on line 1
NULL

それぞれの原因を予想しよう

代入。

php > $a = 0;

php > var_dump($a);
int(0)

$aに代入。echoしてないので返り値は見れないです。
ということで、これは標準出力に吐き出しているわけではない模様。

var_dumpは引数の型や値を出力してくれる便利関数。今の$aはint型で0みたいですね。

=の出力

php > var_dump($a = $b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

php > var_dump($a);
NULL

php > var_dump($b);
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
NULL

var_dump($a = $b)var_dump($a)var_dump($b)を比較すると、

var_dump($a = $b)のまえに$bを読み込んで
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1
を出し、その後、
$aを出力した

と予測されますが・・・その前に、$a = $bで$bがエラーを吐かずに$bだけ出力した可能性が残されてます。

代入単体でテスト

php > $a = $b;
PHP Notice:  Undefined variable: b in php shell code on line 1
Notice: Undefined variable: b in php shell code on line 1

php > var_dump($a = $a);
NULL

あ、$a = $bでエラー出してますね。これは仮定が正しそう。
そして、var_dump($a = $a)すると、$a = $aがちゃんと値をreturnしてるっぽいですね。

3つ繋いだ場合は?

php > var_dump($a = $b = $c);
PHP Notice:  Undefined variable: c in php shell code on line 1
Notice: Undefined variable: c in php shell code on line 1
NULL
  1. $c→エラー
  2. $bにNULL代入、$bを出力
  3. 出力された$b(NULL)を$aに代入
  4. $aを出力→NULL

って感じで私は$a = $b$aを出力したと予想しました!

結論:何事も試してみる大切。

頭で考えていただけだと、$aと$bのどちらを出力するのかわからなかったので、
コードを書いて試してみるとか、ドキュメント読むとか、元のソースコードを追うとか大切。

日記

100日目まであと3日!

100日目に書く記事何も考えてない!!!

とりあえず、少しずつ勉強する生活が安定してきました!

ブラックの会社の人より、自由時間使って勉強しないと置いていかれるって聞いて、
なるほどって思ったし、実際周りの友人残業やばい人いくらでも思い浮かぶし、
頑張って勉強して自分の成長に投資しないといけないですね。

頑張れ私ー!

今日の作業時間

30分+これからもう少しやります

今日の運動

エアロバイク1.5km+これからもう少しやります

PHPの==とか=って実際何してるんだろう【96日目】

演算子だってプログラム

何気なく書いてる+=ってありますが、これって何をしてるのでしょう。
プログラムによって仕様が違うわけで。

そこで先輩に教えていただいた言葉。
『“演算子“とは全てただの関数である』

あーなるほど、引数が2つあって、関数が動いてると考えると確かに・・・

ってことで先輩に問題出されました

"比較演算子"( <, >, ==, <=, >=)とはどのような関数でしょう?

"代入演算子"(=)とはどのような関数でしょう?

「◯◯をinputとし、◯◯をoutputする関数」って答えると良いよと言われたので、
php -aを駆使しながらいろいろ考えましたと。

これ、何気に難しかったです。

私の回答

"比較演算子"

a == b

aとbをinputとし、比較結果をbooleanでoutputする関数

"代入演算子"

$a = $b

[$aのアドレス]と$bをinputし、
[$aのアドレス]に$bを書き込み、
$aをoutputする

$aか$bかどっちを出力してるか調べるの大変だった。

代入演算子の回答を出すために使ったプログラム

$a = 0;
var_dump($a);
var_dump($b);
var_dump($a = $b);
var_dump($a);
var_dump($b);
var_dump($a = $a);
var_dump($a = $b = $c);

php -aで、エラーの出力、エラーが出ても実行する環境じゃないと再現出来ないかも。

実行結果は今手元にないので、明日の記事にしますね。

結論

何気なく使ってるものも意味がある。よく考察すると、理解が深まって、応用ができるようになるよ。

日記

勉強捗ってますね!いい感じにいろいろインプット出来てます!が!

vue、chart.jsが・・・苦戦・・・なんで動かないのこれ(´;ω;`)

ってことで、今日無理だったら明日以降友人に聞こうと思いましたまる。

運動

プログラミング

このあとやります。ただ予定あるので、30分プログラミングと1.5kmエアロバイクの予定。

時間ないからさくっと腹筋ローラーもやっておこう。