エンジニアのひよこ_level10

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

【jQuery】表示する内容を切り替える、1行プログラム【410日目】

こんなとき使う

ボタンをクリックしたら、表示する文字を切り替えたい。

表示する内容を切り替えたいとかは良くあります。

show()hide()を使うのもありですが、たくさん切り替えるとかも面倒なので、
1行ですっきり書いてみましょう

toggle

<button id="btn_before_after">Toggle</button>
<p class="before_after">before</p>
<p class="before_after" style="display: none">after</p>

beforeのpタグと、afterのpタグがあります。afterの文字は、display:noneで非表示です。

$("#btn_before_after").click(function () {
  $(".before_after").toggle();
});

ボタンをクリックしたら、toggle関数が動きます。
toggleは、非表示を表示に。表示を非表示に入れ替えます。

いつもだと、表示するものと非表示のものをクラスで分けたり、今の状態がどちらを表示しているかをチェックするコードを書いたりする必要があるので、簡単ですね!

公式ドキュメント

英語です。

.toggle() | jQuery API Documentation

情報古いですが、日本語

toggle() - jQuery 日本語リファレンス

【Laravel】Modelクラスでクエリビルダが動く理由【409日目】

モデルでクエリビルダ?

モデルのクラスって、テーブルのレコードをオブジェクトにしたようなイメージでした。

でも、以下のようなコードを見ることがあると思います。

User::select('id')->first();

あれ?selectってクエリビルダだよな・・・

このUserってなんだ?クエリビルダ?モデルのクラス???

元コードを読んで見る

Modelクラス

    /**
     * Handle dynamic method calls into the model.
     *
     * @param  string  $method
     * @param  array  $parameters
     * @return mixed
     */
    public function __call($method, $parameters)
    {
        if (in_array($method, ['increment', 'decrement'])) {
            return call_user_func_array([$this, $method], $parameters);
        }

        $query = $this->newQuery();

        return call_user_func_array([$query, $method], $parameters);
    }

    /**
     * Handle dynamic static method calls into the method.
     *
     * @param  string  $method
     * @param  array  $parameters
     * @return mixed
     */
    public static function __callStatic($method, $parameters)
    {
        $instance = new static;

        return call_user_func_array([$instance, $method], $parameters);
    }

なにしてるの?

__callStatic

__callStaticはマジックメソッド。

静的呼び出しをされたときに使われます。

User::select('id')

このとき、 new staticでモデルのインスタンスを作成。そして call_user_func_arrayで モデルクラスのインスタンスが、 selectの関数を 'id'のパラメーターを引き継いで実行。

__call

__callStatic()によって、静的呼び出しだったものが、モデルクラスのインスタンスから呼び出されることになります。

次は、 __callです。静的呼び出しじゃなくなったので。

そこでは、メソッド名が ['increment', 'decrement']のどちらかか確認して、合っていれば、そのモデルクラスのメソッドを呼び出します。

なければここ! newQueryでクエリビルダ用にインスタンスを作って、そのインスタンスselectの関数を呼び出します!

Laravelの元コードを読むのは面白いよ!

ってことで、案外簡単に追うことができました。

Laravelの元コードは、こんな書き方あるのか!と勉強になることがたくさんあるので、是非読んでみてください!

このデザインパターン使ってるのか・・・!ってなることたくさんあります。おすすめです。

参考

PHP: in_array - Manual

PHP: call_user_func_array - Manual

【一週間振り返り】先週の目標を消化できた一週間【408日目】

1.今週一週間の感想(ざっくり)

ちゃんと目標たてて、それは実行できたよ!

2.良かったこと

1.GCPの勉強少しやれた

2.チームに対して、私は話をしてみたいと思える人物でありたい。先輩のような人でありたい

3.もっとこうしたかったこと

GCPもう少し勉強したかったけど、最低ラインはおっけ。次にやることも見つかったのでよし。

4.新しく気づいたこと

とりあえず、勉強楽しい。

あと、トラウマとかまだ残ってるっぽい。

やっぱり私は自分が楽しい、相手も楽しいが重要なようだ

5.来週したいこと

GCPでDBも。

あと、できれば文字認識OCRの勉強もしたい。

6.その他

やりたいことが増えてきた、やれることが増えてきたから

いい感じに前に進めてるいいこと。

【思考メモ】自分のトラウマと行動原理【407日目】

自分を見直し

自分を見直してみて、思ったことメモ

前提?

私は、すべての行動は『やりたいと思ったからやる』と思っています。
『選択』と言い換えることもできるかもしれないです。

なので、『逃げ』も選択、『苦しいけど耐える』も選択。

どちらも、『私がしたいと思ったからした行動』だと思います。

私は、仕事も学習も遊ぶのと同じように思っています。だから、勉強はそこそこ好きでした。
『真剣にやれよ!仕事じゃねぇんだぞ!』に近いようで、違う考え方と思っています。

トラウマ?

自分のどうしても『嫌なことをすること』は耐えられない。
あるいは、『嫌なことをやることに、目的のためだと理由をつけてやること』が嫌なのかもしれない。

では、私は辛いことはやらないのか?
『辛いことを、面白い、ワクワクする状態に変える』とかはしたい。

嫌なことが半年前に起こったときは、それを『ワクワク』に変えるために、
色んな人に想いを聞いて、ワクワクに変えれました。

逃れられないことは?

きっと逃れられないこともあるとは思います。
その時にどんな選択をするかは、考えないといけない。

今まではとにかく耐えてました。無心でやってました。
結果、去年からちょっとしたトラウマというか、近い出来事を見たら涙が出てくるようです。

では、それに対してどう行動するか・・・ワクワクに変えれないときはどうするのか。
悪意によって、ボッコボコにされるのは、学生時代散々やられたけど、社会人になってから同じことが起きたときに、
どうなるのか、正直自分はまだわからないです。

これから私がやること

  • どんな自分になりたいかを考える
  • なにをしたいかを考える
  • はっと気がついたとき、ちゃんと気がついたのを正直に表す
  • 私が想像できないものを生み出す社会にするには、どうすればいいかを行動レベルで考える
  • ほしいコミュニケーション力とは何かを、具体的レベルでブレイクダウンしていく
  • 私の理想の人を探し、その人に会いに行く。会うのが困難な人でも○

【GCP】サーバーのテンプレ。インスタンステンプレートを作る【406日目】

インスタンステンプレート?

このテンプレートは、サーバーのインフラ情報まで含めたテンプレート。

テンプレートだけあって、これがあれば、同じインスタンスを作れるって状態ですね。

何が嬉しいかって、インスタンスグループのように、サーバー落ちたときの対策のために、
全く同じサーバーを作るとき、このテンプレートがあれば、
いくらでも同じサーバーが準備できちゃうわけですね!

作成

基本的には、既存のインスタンスを作成する作業と同じ。

私が作った例はこちら。

1.テンプレートの名前 2.マシンタイプ(サーバースペック) 3.ブートディスク(次の項目で説明するよ!) 4.ファイアウォール(私はWeb用のインスタンスなので、両方許可) 5.詳細設定を開く 6.管理の自動再起動をオンに 7.ホストメンテナンスのインスタンス移行をオンに

f:id:willow710kut:20181123010501p:plain

f:id:willow710kut:20181123010526p:plain

作成!

ブートディスク

OSとかのイメージを選択。

そういえば、この前すでに動かしてたVMインスタンスのイメージがありますね!

カスタムイメージの項目から、自分のプロジェクトを選択。

そしたら、バックアップしてたイメージが見つかりますね!

f:id:willow710kut:20181123005732p:plain

これでよし。

作成したよ!

これでテンプレート作成完了!

これでいつでも同じコピーが作れるね!

ということは、インスタンスグループ作成も・・・?

【GCP】GCEをまるごとバックアップ。イメージを作成【405日目】

スナップショットはこちら

www.nyamucoro.com

イメージって?

インスタンスの構成とか、ぜーんぶまるっとコピー。バックアップ。

スナップショットとの違いは、あっちはハードディスクとかのデータで、ネットワークの構成とかは保存されてないよ。

設定

  1. 保存するイメージの名前をつける
  2. ソースを選ぶ(スナップショットを選択もできるけど、今回は今動いてるインスタンスを選ぶよ)
  3. ソースディスクを選ぶ(対象の今動いてるインスタンスを選ぶよ)

このとき、動いてるインスタンスだと、危ないからインスタンス止めてね!って言われる。

動いたままバックアップも取れるけど、私は怖いのでインスタンスを止めてから作成しました。

f:id:willow710kut:20181123004233p:plain

お金は?

こっちは、スナップショットと違ってお金かかるよ!

でも、めっちゃ高いとかじゃないので、一応確認して使ってね。

これなにに使うん?

サーバーを同じのを作りたいときに使ったりとか。

あと、インスタンスグループのために、インスタンステンプレートにしちゃうとか。

ってことで、この次はインスタンステンプレートを作るよ!

【Mockery】メソッドチェーンで繋がった関数をモックする【404日目】

こんなとき

プログラムで、テストを書こうと思った。

\Validator::make($data, [
    'email' => 'unique:users,email',
])->fails();

これ、Validatorのmakeをモックしたとしても、その後のfailsもモックできていないと、うまくテストできない。

makeとfailsを同時にモックしたい。

こう書く

\Validator::shouldReceive('make->fails')->once()->andReturn(true);

'make->fails'これで、makeのあとのfailsをモック出来る。

【Mockery】テスト対象のメソッド内で、app関数で値が呼び出されているとき【403日目】

こんなとき

class Hoge
{
    public function fuga()
    {
        return app('some_class')->someMethod();
    }
}
class SomeClassProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('some_class', function () {
            return new SomeClass();
        });
    }
}

appでインスタンス呼ばれてるうううう

テスト書くときどうしよう?

使うもの

$this->app->instance(Hoge::class, $mock);

テストコード

public function testFuga()
{
    $mock = Mockery::mock('SomeClass');
    $mock->shouldReceive('someMethod')
        ->once()
        ->andReturn('hoge');

    $this->app->instance('some_class',$mock);

    $this->assertSame($this->hoge->fuga(), 'hoge');
}

何をしているのか

appの結合を新しく宣言しました。

通常時は、SomeClassProviderで'some_class'に対してsingleton結合されていました。
使われるクラスは、 singletonで作られた、SomeClassのインスタンスです。

これに対してテストコード内では、'some_class'に対して、$mockのインスタンスを返す、instance結合を宣言しました。
なので、テスト実行時にapp('some_class')をすると、$mockのインスタンスが返されます。

これによって、$mockによる関数実行が行えます!

参考

サービスコンテナ 5.3 Laravel

appではなく、newされてる場合

www.nyamucoro.com