エンジニアのひよこ_level10

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

【Laravel】多対多のリレーションで、中間テーブルの値を取得【111日目】

f:id:willow710kut:20171223184135j:plain

多対多のリレーションって?

willow710kut.hatenablog.com

自分の過去記事ですが・・・

こんな時どうする?

menbers
id|name
1 | ういろう
2 | りんご
3 | マジシャン
groups
id|name
1 | 野球部
2 | 麻雀部
3 | ダーツ部
member_group
id|member_id|group_id|other_data
1 | 2| 1|a
2 | 2| 3|b
3 | 3| 3|c
4 | 3| 2|d

other_dataを取得するには?

中間テーブルにother_dataってデータがありますね。

これを取得するにはどうするかというお話。

結論

withPivotを使う

class Member extends Model
{
    /**
     * memberが属するグループを取得
     */
    public function groups()
    {
        return $this->belongsToMany('App\Group')
            ->withPivot('other_data');
    }
}

取得方法

foreach ($members->groups as $group) {
    echo $group->pivot->other_data;
}

とか

$groups[0]->pivot->other_data;

こんな感じに取っていただければ。

日記

111日!きれいな数値!

ってことでかなり長続きしてますね。

定期的にブログを書いているエンジニアの方はまだ2人しか知らない・・・
でもだからこそ引き合わせたいなぁって思いました。

ブログ系エンジニアの集いとか。

・・・ブログ系エンジニアとは #とは

会社にもブログ一年続けると宣言したので、引き続き頑張っていきますー!
いつか時間ができたら、技術記事と日記を分離しようそうしよう。

ブログ書き始めた時は、まさか80記事もプログラム系の記事を書くと思わなかったんや・・・

Macにgo言語をインストール【110日目】

インストールのガイドサイト

Getting Started - The Go Programming Language

手順

  1. Downloads - The Go Programming Languageから、各OSに合わせたリンクからダウンロード。
  2. macなら.pkgを動かして、案内に沿ってインストール。

おしまい。

テストしてみる

hello.goを作成

package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

実行

go run hello.go

f:id:willow710kut:20180131221224p:plain

日記

とりあえずgo言語触ることになりました。

これから勉強していきます。

今一冊本を読み始めたので、ゆっくりやっていきます。

今回は特に書くことなしですん。

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

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

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

ハノイの塔メモ2

func(x,0,2)
{
 if(x > 1) {
  func(x-1,0,2)
 } 
 move(0,2)
}

func(自分の値, 移動元の場所、移動先の場所、その他の場所)

やりたい動き

1個
(1, 0->2)

2個
func(2, 0, 2)
(1, 0->1)  
(2, 0->2)  
(1, 1->2)  

3個
func(2, 0, 1)
(1, 0->2)
(2, 0->1)
(1, 2->1)

func(3, 0, 2)
(3, 0->2)

func(2, 1, 2)
(1, 1->0)
(2, 1->2)
(1, 0->2)

もし一番下ならゴールへ。そうでなければ、2をゴール以外に。

func(a, x, y, z)
{
 if(x > 1) {
  func(a-1, x, z, y)
 }
 move(x,y)
 if(a != 1) {
  move(z, y);
 }
}

ハノイの塔再苦戦中・・・【107日目】

ハノイの塔解けたと思いました

プログラムにビミョーに出来てない。

ただ、もう少しでできそう。

また眠って起きたらひらめいたりしないかな。

ってことで以下にメモ書き。

ハノイの塔のメモ書き

■塔再現
$array = [[1,2,3,4,5],,]

■塔移動
$array->pop()→$array->push()

tryとcatchでくくる。pushする前に、入れるための値と、配列の頭の値を比較して、
入れる値の方が大きかったらエラー。

■移動する関数 自分の塔の数、今いる塔の場所、目的の場所

func(x,0,2)
{
 if(x > 1) {
  func(x-1,0,2)
 } 
 move(0,2)
}

めっちゃ途中・・・

■やりたい動き 残り1個 move(0, 2)

残り2個
(0, 1)
(0, 2) N+1の動き
(1, 2)

残り2個と、残り1個の2つを関数化する必要あるのかな。それとも一個で終わるかな。

日記

またしても、考えるだけで2時間・・・1時間半くらいだったかもしれない。経ってしまった。

わかる時にはぽーんって来るのになー。 たぶん、あと少しな予感はしてるんだ、あと少しな気がするんだ。

横のつながりを増やそう!ベンチャー企業17新卒新年会!【106日目】

今日はイベントに行ってきました!

ということで、ベンチャー企業で、17卒の人集まれー!ってイベントに行ってきました。

交流会ではみんなと交流して、特徴に当てはまる人を探そうというゲームとか、
様々な交流コンテンツがありました。

運営の皆様本当にありがとうございます!
斬新で面白いコンテンツでした!あのビンゴの盛り上がりは凄かったですね!

他のベンチャー企業ってどんなものなのかなーっていうのも知ることが出来て、
とても面白くてためになるイベントでした!

また4月にやるそうなので、興味ある方は是非!その時は私から声かけれるようにします!

今の会社結構好きなんだなって思ったやつ

他社の話を聞いて、いいな、羨ましいなって思うことはやっぱりあったんですけど、
でも一方でうちの会社で良かった、うちの会社のおかげでこうなれたと思ったこともたくさんあって。

ただ、同時に自分の今いる環境を生かすことが出来なければいけないとも思いました。

『絶対的に良い環境』ってのはやっぱり難しいわけで。
だから、それを生かすも殺すも自分次第。

この環境で自分はどうしよう?っていうのをちゃんと考えながら活動していかないと、
成長もなにも得られないまま終わってしまうのかなって思いました。

日記

初めてレベルが近いエンジニアとお話した気がする・・・!
HTMLやCSS、エンジニアあるあるとかお話することになるとは。

あと、ようやくハノイの塔解けました。

3時間悩んでもわからなかったのに。
朝起きて、シャワーを浴びて、2分でわかりました。

これならプログラムにできそう。
いやほんと、シャワー浴びるとひらめくのってなんでなんだろうね。

ただ、急にピンと来たから、今もう一度ひらめけって言われても無理だし、どうやって導き出したかわからない・・・w

とりあえず頑張ってプログラムにしなければ・・・!

三国志の馬謖は何を想っていたのだろうか【105日目】

自分を馬謖と例えるわけではないが

私の弱点として、『詰めが甘い』『これと決めたら他が見えなくなる』とかいう弱点がある。

街亭の戦いの馬謖がそうだったとは限らない。

ただ、私なら同じ事をしてそして失敗してしまうのではないかとか。

馬謖って?

詳細は省きますが、
『天才軍師と呼ばれた諸葛孔明に気に入られていた』
『実際頭良かった』
『命令破って、自分のいいと思う行動をして、大失敗して処断された』

みたいな感じでしょうか。

街亭の戦い

高所を取ることは、戦いで有利とされていることが多いです。
馬謖は命令を破って、山の上に布陣します。

敵は水路を断って水を失った馬謖の軍は士気が落ちて攻め込まれ、敗北します。

馬謖は何を考えていたかはわからない

『高所を取ることは良いことだ』と様々な兵法書から短絡的に考えて、他が見えなくなっていたかもしれないです。
水路を絶たれる可能性を忘れ、詰めが甘かったのかもしれないです。

ただ、敵軍の方が多いこともあって、何かしらのアドバンテージを得なければいけないと考えていたのかもしれません。

大昔の話なので、そもそもこの記述も誰かの創作かもしれません。

でも、そこにはきっと何か思う所があったんじゃないかなと。

まあ・・・何が良いことになって、何が悪いかとかはわからないんですけどね。
それを踏まえて、私はどうするべきなのだろうって。今日の朝ずっと考えていました。

慢心はいけないけど、失敗を恐れるのも嫌だという、自分の気持ちに気づけました。

日記

実は幼稚園-小学生の頃からゲームと同じくらい時代小説が大好きで、特に三国志戦国史、幕末は大好きでした。

親が買ってた歴史の漫画を漫画読んでハマり、高校生までの趣味は『図書館で本を10冊借りること』『bookoffめぐり』とかでした。

大学入ってからは読書からすっかり離れていました。

ただ、また読書やりたいなと。ここ最近は勉強で本を読む習慣が戻ってきたのでこんなこと考えたのかなと。

という、自分の気持ちをつらつらと書く日記でした。

あーハノイの塔のプログラム書けない。

もう少しな気がする・・・自分の塔の個数、送り元、送り先とかが重要な気がするのよ・・・

1-2-1-3-1-2-1-4-1-2-1-3-1-2-1 って動かすものが対照だったから何かがわかりそう。4で折り返すから再帰で書けそう。

ただ、こうやって法則見つけようとしてる時点で再帰考えるのは無理とも聞いてるのでちょっと頭冷やそう。今日は3時間考えた一度止めたら何かわかるかもしれない。