もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

CakePHP3のfindではバッククォートが使われない対応

Cakephpネタ。

レガシーなシステムとかだと、MySQL予約語とかがカラム名に設定されてたりする(レガシー関係ないか・・・)

実際自分が携わっている案件でも、

CREATE TABLE `customer_profile_options` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `customer_id` int(10) unsigned NOT NULL COMMENT,
  `key` varchar(128) NOT NULL COMMENT '項目名',
  `value` text NOT NULL COMMENT '値',
  `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  CONSTRAINT `customer_profile_options_ibfk_1` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

みたいなイメージの縦持ちテーブルがあって、keyはMySQL予約語として使われている。

QueryBuilderとかでSQL組み立ててinsertとかすると

INSERT INTO customer_enquete_options (id, enquete_master_id, key, value, created) VALUES (?, ?, ?, ?, ?);

みたいな感じで、SQLが組み立てられる。

CakePHP2系までは各カラムにバッククォートが適用されて上記のinsert文は問題なく発行できた。

ただ、CakePHP3では上記のようにデフォルトでバッククォートがつかないようなので、SQL syntaxエラーが発生していた。

うーんうーん。とCakeのDatabaseDriverあたりのクラスを見てみると Cake\Database\Driver.phpで以下のような文を発見。

<?php

..
        $this->_config = $config;
        if (!empty($config['quoteIdentifiers'])) {
            $this->enableAutoQuoting();
        }

それっぽい。

公式で確認するとたしかにあった。

quoteIdentifiers あなたがテーブルやカラム名予約語特殊文字を使用している場合は true に設定します。 この設定を有効にすると、SQL を生成する際に クエリービルダー によって引用符で囲まれたクエリーが生成されます。 これはクエリーを実行する前に横断的に処理を行う必要があるため、パフォーマンスを 低下させることに注意してください。

ということで、config/app.phpのDatasources項目にある quoteIdentifierstrue にすると、正常にバッククォートが適用されていた。

公式の文で注意されていたパフォーマンスを低下させるっていうのがどの程度のものなのかビクビクするけど、ビクビクするくらいならばテーブル設計やり直したほうが良さそう。。。

とにかく、設計より設定って感じだった。

人に期待しないという言葉の意味を個人的に考えてみた。

こんばんは。

今日あるツイートが自分のタイムラインに流れてきたので、気になってしまった。

内容は

人に期待しないということ。

なにがそこまで気になったか自分の中でもよくわからなかったので、ちょっと考えてみた。

そもそも期待という言葉の意味を辞書で調べると、こういうことのようだ。

dictionary.goo.ne.jp

あることが実現するだろうと望みをかけて待ち受けること。

当てにして心待ちにすること。

人に期待する = 人(他人)があることを実現するだろうと望みをかけて待ち受けること。

人に期待しないはその逆。

つまり他人が何かを実現することはないと思っている。もしくは、実現する・しないすら考えない。

ということだと思う。






僕がこのツイートを見たときはじめに思ったのは、そういう考え方もあるのかと思ったのと同時に

「それならば一人でやればいいのに」

ということだった。

期待していない人たちと仕事する意味ってあるの?誰も期待していないなら1人仕事すればいいのに。という感想だった。

まぁ実際はそういうわけにはいかず、やはりチームを組んで作業をしていくのだと思うけど、チームメンバーが期待されてないということを知ると、どうおもうんだろうかと感じた。

例えば僕とかは、期待されていないのかと思うと、なぜ期待されていないのかという原因を探って自分自身で改善できるように努力をすると思う。

ただ、それが自分に原因がなく、その人の思想的に人に期待しないということがわかると、どれだけ頑張っても期待されないのかと思ってしまい、モチベーションを下げてしまいそうだなと思った。

それは、僕の、モチベーションの芯の部分に

「あの人の期待に応えられるように頑張ろう」

というものがあるからだ。 なので、そもそも僕に期待をしていないとわかってしまうと、僕はモチベーションを保てないだろうなと思った。

これは、「人に期待しない」という意味を言葉通り受け取った場合の、僕の結末予想だ。

メンタル弱くてごめんなさい。




でも、人に期待しないという思想を持っている人も、そうは言ってるけども本当はそんなことはないんじゃないか思っている。

例えば人を採用するとき

「この人はこういう技術を持っているから、プロダクトのこの領域に力を貸してくれそうだ」

「この人のリーダーシップは、チームを円滑に効率よくまわしてくれそうだ」

など、採用したい人になにかしらの「期待」して採用しているはずだ。

「期待してないけど、採用しよう」

なんてことにはならないと思う。

例えばタスクをふるときも

「この人がこの機能を以前に作っているから、この機能追加タスクも効率よく作業を進めてくれそうだ」

「この人にはもっとこの技術をつけてもらいたいから、このタスクを任せてみよう」

など、何かしら期待しているはずだ。

「特に誰にも期待してないから、重いタスク順にランダムに振り分けよう」

とはならないと思う

つまり、人に期待しないという人も必ずどこかしらで、人に期待しているはずだと思う。

「人に期待しない」という強い言葉が目立っているだけで、本当に言いたいことはもっと別のことではないのかと思った。

掘りすすめると自分が何に気になったのかがわかった気がした。

自分はその、人に期待しないという強い言葉に嫌悪感を抱いたんだとおもう。

僕もあえて強い言葉を使うと、捉え方によっては、

人に期待しない = 人を信用しない

と変換できてしまうからだ。

信用していないチームと一緒に仕事はしたくないだろうし、メンバーとしても、信用してくれない人と一緒に仕事はしたくないとおもう。

こういった負の考えが、頭をよぎって、人に期待しないと言う言葉が気になってしまったんだとおもう。

本当はもっと別のことを言いたいんだろうなという、裏の意味を考えずに、その強い言葉だけが気になったのだろう。

ただ、自分は読解力も語彙力も皆無なので、本当は何を言いたいのだろうかと読み解き考えるのは無理だった。

なので、ここからはあくまで自分の予想で考えてみる。



人に期待しないということで得られる効果で、ぱっと思い浮かぶのだと、はじめから期待をしていないから、がっかりする事や、イライラする事が少ないという感じだと思う。

確かに、期待をしていないのだから、どんな結果になろうががっかりもイライラもないということなのだと思う。

でもそれってチームにとって健全なのだろうか。

僕的には(青い考えかもしれないが)チームがプロダクトの成功のために一丸になることってすごく大事なことだと思う。

チームメンバー全員が全員ともメンバー同士で期待を持ちあい、下回りそうな場合はお互いにフォローして、上回りそうな場合は称賛しあうみたいことが、重要なのではと思っている。

期待を持ち合うことでがっかりすることやイライラすることを少なくすることもできるのではないのかと思う。




.......なにがいいたいかよくわからなくなってきたのでそろそろやめておこう。。。

僕が言いたいのは人に期待しないという手法を批判しているわけではなく、そういう考え方もあるのかと理解しつつ、自分ならばこうだなという考え方をまとめてみただけということだ。

以上。おやすみなさい。

Vueやってみてる1

はじめに

こんばんは。

この記事からだいぶ間が空きましたけど、vueまたやり始めます。

なかなかモチベーションが上向きにならないんですが、頑張ってブログ書くというモチベーションだけは続いているので、気合ですよね気合。

codeprepにvueのブックがあったので、思い出しがてらやってみました。

やってみた

v-show(表示・非表示)

v-if でもおんなじことやれるけど、こういうのもあるみたい。

 <div id="app">
     <p v-show="is_show">表示だよ!</p>
 </div>
 
 <script type="text/javascript">
    var app = new Vue({
        el: "#app",
        data: {
            is_show: 1
        }
    });
</script>

f:id:kojirooooocks:20180814015848g:plain

v-if vs v-show

v-if = falseの場合は、描画されなくて、v-showの場合はcssのプロパティを変更するだけみたい。

使う場所がかなり違いそうだな。

算出プロパティ

以下のような、なんらか処理が必要を噛まして、その結果を表示したい場合に使える技みたい。

<div id="app">
    <p>{{ deliveryAnswer }}</p>

    <select name="delivery_date_list" v-model="delivery_date_list">
        <option value="">選択してください</option>
        <option value="1">2018-08-10</option>
        <option value="2">2018-08-11</option>
        <option value="3">2018-08-12</option>
        <option value="4">2018-08-13</option>
        <option value="5">2018-08-14</option>
        <option value="6">2018-08-15</option>
        <option value="7">2018-08-16</option>
    </select>
</div>

<script type="text/javascript">
    var app = new Vue({
        el: "#app",
        data: {
            delivery_date_list: "",
        },
        computed: {
            deliveryAnswer: function() {
                if (this.delivery_date_list === '') {
                    return ;
                }

                let result = "配送可能";
                if (parseInt(this.delivery_date_list) >= 4) {
                    result = "配送できません";
                }

                return result;
            }
        }
    });
</script>

f:id:kojirooooocks:20180814015951g:plain

普通に関数使って

deliveryAnswer() って感じで呼び出すのと何が違うのかな?と思ってたら、公式に書いてた。

算出プロパティ vs メソッド

算出プロパティはキャッシュされるようだ。

ちゃんとした違いがあった。

ウォッチャー

そのまんま、データの変更の監視を行ってくれる。

<script type="text/javascript">
    var app = new Vue({
        el: "#app",
        data: {
            deliveryAnswer: '',
            delivery_date_list: "",
        },
        watch: {
            delivery_date_list: function (new_value, old_value) {
                let result = "配送可能";
                if (parseInt(this.delivery_date_list) >= 4) {
                    result = "配送できません";
                }

                this.deliveryAnswer = result;
            }
        }
    });
</script>

f:id:kojirooooocks:20180814020030g:plain

使い方的には以下、

ウォッチャ

非同期やコストの高い処理を実行したいときに最も便利

だそう。

ウォッチャーは非同期通信を行う際のイベントを検知するもので、算出プロパティは、ロジックをhtml内に入り込ませないようにするための機能って覚えとく(キャッシュもあるしね)

フィルター

渡された値を別の値に変換する機能。

<div id="app">
    <p>{{ message | label }}</p>
    <input type="text" v-model="message">
</div>

<script type="text/javascript">
    var app = new Vue({
        el: "#app",
        data: {
            message: ""
        },
        filters: {
            label: function(value) {
                if (value === '') {
                    return value;
                }

                return "あなたの名前: " + value;
            }
        }
    });
</script>

f:id:kojirooooocks:20180814020119g:plain

なんか例で作ったやつがイケてない。。。

でも正直使い勝手が難しいところ。

良い使い方教えてください。

終わりに

終わり。

最初の方にやったやつ完全に忘れてるから、四苦八苦だっけど、やってるうちに思い出しました。

次も続いてvueやってみますー。

Sassやってみた

はじめに

こんばんはー。

低空飛行のモチベーションが続いてる僕です。

比較的頭使わず、かつ、あまり触ったことないやつを勉強中です。

今回はSassやってみました。

自分はフロントエンドの知識はすごく薄いし、CSSもあんま得意じゃないのでSassとかもあんまり興味なかったんですが、食わず嫌いというか触らないのに興味ないというのも失礼なので、一旦触ってみようと思ってやってみました。

まぁ自分みたいなSass初学者が説明しても大した説明できないんで、Sassとはなにかっていうのは割愛します。

今回勉強して面白いなーと思ったところをかいてきます。

覚えるために。

面白かった

アンパサンド

親のセレクタを参照できるってことみたい

example.scss

a {
  &:hover {
    cursor: pointer;
  }
}

example.css

a:hover {
  cursor: pointer; }

でもそもそもネストで書けるから、以下の書き方もできる。

example.scss

a {
  :hover {
    cursor: pointer;
  }
}

example.css

a :hover {
  cursor: pointer; }

使い分けの違いが今のところ思いつかないけど、もっと大掛かりなスタイルを記述する際に差が出てくるのかな?

if文

変数使えるってのは知ってたから多分できるんだろうと思ってたけど、やっぱりできてしかもめちゃ簡単だった。

example.scss

$width: 500;
$background_color: 'red';

@if $width >= 500 {
    $background_color: 'blue';
}

body {
  background-color: $background_color;
}

example.css

body {
  background-color: "blue"; }

mixin

メソッド的に定義できて、@include で簡単に使いまわせる。

example.scss

@mixin image-style($border-color: #ddd) {
  border: 1px solid $border-color;
  border-radius: 5px;
  padding: 5px;
}

.list-image {
  width: 150px;
  @include image-style();
}

.detail-image {
  width: 500px;
  @include image-style(#000);
}

example.css

.list-image {
  width: 150px;
  border: 1px solid #ddd;
  border-radius: 5px;
  padding: 5px; }

.detail-image {
  width: 500px;
  border: 1px solid #000;
  border-radius: 5px;
  padding: 5px; }

extend

スタイルの継承ってのが面白かった。

example.scss

.submit-text-style {
  font-weight: bold;
  font-size:   16px;
}

.user-register-button {
  @extend .submit-text-style;
  color: green;
}

.purchase-button {
  @extend .submit-text-style;
  color: red;
}

example.css

.submit-text-style, .user-register-button, .purchase-button {
  font-weight: bold;
  font-size: 16px; }

.user-register-button {
  color: green; }

.purchase-button {
  color: red; }

でもmixinでも同じことできるから、使い分けが結構難しそう。

終わりに

プログラムチックに触れるのはいいなーと思いました。

こんな感じで書けるならば食わず嫌いはやめてCSS勉強してみたいと思いました。

ただ、自分はデザインセンスがないんで、知り合いのデザイナさんに教わりながらもうちょいSassつまみ食いしてみようと思います。

勉強しはじめた。

こんばんは。

先週やる気云々話してて、今週何もしないのは流石にまずいので、仕事も適度に終わらして勉強しようと思います。

まだ全然全盛期のモチベーションに到達してないので、ウォーミングアップ的になにか簡単なものをやっていきたいなと思います。

それを続けて積み重ねていって、モチベーションを上げていこうかなと。

今目下の課題は持続力なのでね。

で、何を勉強しようかと思ってたんですが、以前やってたCODEPREPやProgate,Udemyなどのオンラインの学習をやろうかなと思います。

初心者向けが多いので、比較的自分的には必要ないものが多めですが、多言語の習得の入りにはちょうどいいし、今のモチベーションにもちょうどいいかなと。

このあたりを続けてモチベーションを高めたらまた、本買って勉強し始めようと思います。

頑張って持続させて今年のはじめのやる気を取り戻すぞ!!

やる気がでないとき

こんにちは。

今日は別に技術的な話じゃないです。

やる気がでないって話。

夏バテなのか、それともプライベートが忙しくて疲れているのか。

とにかく仕事終わって、筋トレして、風呂入って、いつもならば勉強しよーとってなるんだけど、

「今日はやる気がでないなー」

となって、寝ちゃう。

今月はまさにそんな谷間の月。

やる気の出ない自分に焦燥感を覚えるけど、なかなか体は前を向かない。

ある人にこの気持を伝えたところ、

「そういうときもあるから、焦んなくていいよ」

っていう優しい言葉を頂いた。

すごく嬉しかった。

嬉しかった。。。けど、やはりこのままではダメだと思う。

僕はほんと馬鹿だから、そういった優しい言葉をもらうと、すぐ鵜呑みにする。

「あー今そういう時期だからしゃーねーなー」

ってなる。

これじゃあだめだ。

夏バテだなんだと前口上を述べたけど、そんなものは関係なくて結果だけを見ないといけない。

今年の最初に比べて完全にモチベーション下がっていて、確実に勉強時間も減少してる。

そしてそれをただ、疲れや暑さのせいにしてるだけ。





というわけで、また今日から勉強頑張ります!

暑いならば裸でクーラーガンガンかけてやりゃいいんだし、疲れてても5分でも10分でもやらねば。

続けることが大事。すっかり忘れてた。

今年の1月の気分で頑張るぞ!!



ちなみに同じこと(やる気が出ないこと)をさっき奥さんに言ったら、

「焦ったほうがいんじゃない?」

という厳しい言葉を頂いたw

なんというか心の中で思ってたことをぐさっと、曇りなき眼で言われたので、結婚してよかったと思った。

cakephp3のpaginateでsubqueryを使う

こんにちは。

簡単なのですが、忘れないようにメモ。

CREATE TABLE `tag_masters` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL COMMENT 'タグ名',
  `created` timestamp NOT NULL COMMENT '登録日',
  `modified` timestamp NOT NULL COMMENT '更新日', 
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `tag_relations` (
  `tag_id` int(11) unsigned NOT NULL COMMENT 'タグID',
  `item_id` int(11) unsigned NOT NULL COMMENT 'アイテムID',
  `created` timestamp NOT NULL  COMMENT '登録日',
  PRIMARY KEY (`tag_id`,`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

こんな感じのタグテーブルがあったとして、cakephpのpaginateでデータを取ってきたい時に、各タグの紐づけ数を一緒に取るときはこんな感じになるようです。

<?php
$this->paginate = [
        'fields' => [
            'TagMaster.id',
            'TagMaster.name',
            'TagMaster.created',
            'TagMaster.modified',
            'TagMaster__count' => "(SELECT count(l.tag_id) FROM tag_relations AS l WHERE TagMaster.id = l.tag_id)"
        ]
];

cakephpがDBにSQLを発行する際、各カラムをEntity名__カラム名で別名を貼って発行するので、その命名に沿って指定すれば取れるってことでした。

良かった。解決。