さんさろ

さんさろ

プロダクトエンジニアの雑記&技術、たまにドイツ

ネットが瞬断した原因:結論

ネット瞬断事件の原因

f:id:binthec:20200922222803j:plain

関係ないハイビスカス

以前、ネットが瞬断した記事を書きましたが、様子見して2ヶ月くらい経ちましたので、結論です。

binthec.hatenablog.com

結論

やはり、Avast が原因だったようです。

McAfee に変更して以来、あんなに毎日頻発していた瞬断が発生しなくなったので、確定でいいと思います。非常に残念ですが。

Avast はかれこれ 10 年近く使っていたんですが、ネットが無いと生きていけない人間()なので、Avast には別れを告げて、これからも乗り換えた McAfee を使っていく予定です。

しかしこれ、今はネット回線は J:COM 使ってるからいいとして、もし J:COM さんから乗り換えたらどうするのかな…とはまだ決めていませんが。

ひとまず、一見落着。

ネットの瞬断が発生したので原因を探ってみた

お久しぶりです

なんだかほぼ1年ぶりの投稿になってしまいました。生きてます。

去年は6月中旬から仕事が忙しくなり、目が回るような日々でした。そのプロジェクトも今年の5月には終わり、やっと気持ち的な余裕も出てきたといった所でしょうか。

いろんな所に遊びに行きたいのに、このご時勢……。必要最低限以外は外出せず、庭の草むしりかアプリ開発に勤しんでいます。

 

ネットの瞬断が頻発

本題です。最近、多分ここ半月くらいだと思うのですが。Chrome でインターネットに接続している最中に、ネットがちょん切れることが頻発していました。

大体が

ERR_CONNECTION_RESET

f:id:binthec:20200801212100p:plain

エラー画面

こんな感じのエラーで、ついさっきまで見られていたサイト、例えば Yahoo! のトップページなんかが、リロードしたりニュース記事に飛んだりすると突然見られなくなることがありました。リロードしても同様のエラーでサイトが見られません。でも、他のサイトは普通に見られたりする。

あんまり頻発するし、一度ちょん切れると、何分か待たないとサイトが見られるようにならず不便極まりないので、原因を調査しました。

 

いきなり結論を書いてしまうと、おそらく Avast が悪さをしていたものと思います。多分。

 

せっかくなので、順を追って。

 

6月に Wi-Max2 を解約して、J:COM にしたばかりだったので、回線かモデムかな?と最初は一番外側を疑いました。2020年6月1日に乗り換えて、7月半ばまではなんでもなかったのに、なんで今さら?と思いもしましたが。

とりあえず、モデムの管理画面にログインして、イベントログを見てみると、

No Ranging Response received - T3 time-out;CM-MAC=xx:xx:xx:xx:xx:xx;CMTS-MAC=xx:xx:xx:xx:xx:xx;CM-QOS=1.0;CM-VER=3.0;

こういうクリティカルに分類されるログが出ている。

調べたらこういう↓ページが出てきて、

https://heecheee.com/blog/2017/10/01/jcom-net-speed/

ケーブルの接触不良っぽかったので、これかな?と思ったけれど、その後も頻発するネット断絶の際にイベントログを確認してみるも、同様のログは出ていない。

これが原因ではないっぽい?

 

次に、自宅には仕事用PCと自分PCの2台があって、最初は気が付かなかったのですが、どうやらこのエラーは自分PCのみで起きている様子。仕事用PCはなぜかなんともありません。

仕事用PCも当然のことながら同じモデムの Wi-Fi 使ってますので、ここから、モデムやネットワーク回線そのものが原因であるという線はなくなりました。

PC 固有の原因っぽい。

 

Chrome のバージョンかと思ったけど、どっちの Chrome も自動更新がオンなので、最新版です。 

Chrome 、というかブラウザ?は OS によって挙動が違うことがあるっぽいという記事を見つけたので、今度はこちらに目星をつけました。

PC2台とも mac ですが、自分用PC は未だに High Sierra だったのです。早速、データを全てバックアップとって、Catalina にアップグレード。

アップグレードは問題なく完了。

 

さあ、いざ!これでどうだ!

 

と思ったけど、早速ネットの断絶が発生。mac os のアップグレードとネットの断絶発生が今日の出来事。

どうやらブラウザや OS に起因するものではなかったっぽい。

 

そして、つい2時間ほど前に行き着いたのが、アンチウイルスソフトの可能性。

試しに、ネットがちょん切れてから、Avast のウェブシールドをオフにしてすぐにサイトに接続すると、あら不思議!繋がるじゃああーりませんか………

ネットがちょん切れてから4度同じ方法で試すと、4度ともサイトに問題なく繋がる。

今度こそこれが原因かな?

と思い、早速 Avast をアンインストールして McAfee をインストール。J:COM 会員は無料で McAfee が使えたので助かりました。

f:id:binthec:20200801214231p:plain

McAfee

んで、現在。

とりあえずネットの断絶は発生していないけども、これで果たして治ったのか。多分これで正解だと思うけど、ひとまず静観します。

また後ほど、結果はご報告したいと思います。

 

【追記】結論出ました

記事書きました。もしよければ。

binthec.hatenablog.com

 

CSSで、全要素が奇数個の場合の、最後の偶数番目の要素を指定する

疑似クラスを使って解決してみる

CSS で、要素が奇数個ある時の、最後の偶数番目の要素を指定したかったのです。

例えば、

<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
</ul>

で言う所の、6に CSS を指定したい。 PHP で判定させてクラスを付与するのでもいいんですけど、CSS の疑似クラス使ってなんとか頑張ってやれないなぁ、と。

最初はこうしてみた。

li:nth-child(2n):last-child {}

これでいけるかなーと思ったけど、last-child はホントに「最後の child」、なので、7しか判定してくれないみたい。最後が偶数ではないので、↑この指定は奇数個ある場合には何も指定出来ない。(偶数個だったら問題なく最後の要素を指定出来るけど。)

で、どうだったら指定出来たかというと、

li:nth-child(2n):nth-last-child(2) {}

これで、全部で奇数個ある場合の、最後の偶数番目の要素、ここで言う所の6を指定出来ました。

ちなみに、偶数個ある場合の、最後の奇数番目の要素を指定する場合は、こう。

li:nth-child(2n+1):nth-last-child(2) {}

見れば「なるほど、確かに」ですけど。ちょっとハマってしまいました。

さくらのレンサバで無料SSLを使ってみる

Chromeで標準で警告が出るようになったということなので

趣味でやってるサイトに SSL を導入してみることにしました。

大切な情報をやりとりするわけではないですが、まあメールフォームもあるし、SSL証明書がタダだし……ということで。

全然難しくないのでメモする意味もなさそうですが、とりあえず備忘録。

 

環境

 

手順

1)コンパネで無料SSLの申し込み

 

ここまで来たら、しばし待つ。

 

2)登録完了メールが来る

出来たらしい。

 

3).htaccessSSL無しのアクセスを、全て SSL へリダイレクトさせる

以下は、Lumenの場合。変更する .htaccess

public/.htaccess

です。ここ地味にハマりました。

最終的な中身は、こう。

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

RewriteEngine On

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

# さくらの説明書き、プラス↓が必要だった。
RewriteBase /

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteCond %{ENV:HTTPS} !on
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

 

なんか、うん、

RewriteBase /

が必要だったみたいです。

でないと、トップページは見られたけど、それ以外のページにアクセスすると

Internal Server Error で返ってこられなくなりました。以下、その時のエラーログ。

    Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get backtrace.

一人で勝手に右往左往しました。

 

注意

最初、トップページに https:// でアクセスしても、証明書は表示出来るのに、「保護されています」が表示されなくて、なんでじゃ?と思ってたのですが。

ページ中に、例えば画像のリンク先が http:// で始まるもの(いわゆる直リンク画像)などがあると、セキュアじゃありませんと出る。

折角 SSL 入れたのに。

直リンク画像を全て変更したら、無事、保護されていますになりました。

 (これはyahooですが。)

 

参考

help.sakura.ad.jphelp.sakura.ad.jpqiita.com

PHPカンファレンス福岡2018に行ってきました

ぺちこん福岡2018!

行ってきました、ぺちこん in 福岡!

勉強になったなー。楽しかったなー。いろんな人にお会い出来てよかったなー!

勉強した気になって満足しないで、これを次に繋いで行かねばと思う所であります。

 

前日は bit forest 様にお邪魔しました

福岡へは前日の金曜日に入りました。ツイッターで続々とペチパーの方々が福岡入りしてる様子が流れてきて少しずつわくわく感が高まります。

福岡行きの高速バスに乗り込んだ所で、@tomzoh さんから会社見学(?)のお誘いを頂いて、天神に付いてから急遽 @cakephper さんの bit forest 様にお邪魔することに。

既に幾人かのペチパーの方々が集まっていて、少し話なんかをしつつ、これから前々夜祭に行く人、ご飯食べ行く人に分かれるようでした。

私はドイツレストランに行く予定だったので、その日はそこでお別れ!

 

当日!

気になるセッションが目白押しで、頭フル回転させて話を聞いていました。

いやーぽんこつにも分かる初級編のすごいタメになる話もあり、やっぱり難しくて「……分からん\(^o^)/」なセッションもあり、いろいろでしたけども、どのセッションも皆様のPHPに対する愛!が伝わって来る内容で、本当に勉強になるし、モチベーションがガッと上がりました。

ログの話は「へぇ〜〜〜〜」の連続で、今まで普通にアクションログ機能とか作ってたけど、もっとちゃんとロギング考えないとダメだなと思い知らされました。反省…。

LTは、ほんと皆さんレベル高くて聞いててすげーって毎回なります。きっとたくさん練習されてるんだろうな…!オチまでしっかりついてて、面白くて毎回大笑いさせてもらってます。

 

そういえばノベリティのバッグがすんごい可愛くて、これは買い物バッグに使おうと思ってツイートしたら、

なんと閉会式で @akase244 実行委員長さんの スライドに出てて「!!(゚∀゚)」ってなりました。もっとちゃんと写しておけばよかった。

そして、楽しい時間ほどすぐ終わってしまうのです……。

 

懇親会→二次会

もちろん懇親会も参加です。今回は懇親会中のLTもなくて少し残念な気もしましたが、その分たくさんの方とお話出来たのでよかったです。

いや、ほんと、会う人会う人「あ、あの本書いてらっしゃる…?!」ってなって何なんだろうこれと思いました。すごい人がいっぱいいてチキンはビビリっぱなしです。

 

そしてもちろん二次会も行きました笑

去年は4人でのんびりでしたが、今年は結局何人居たんだろう、30人くらい?で結局最後はお店貸し切り状態でした。

 

後夜祭

そして3日目\(^o^)/

後夜祭です。Fusic 様であった後夜祭に行ってきました。

表の入り口が閉まっていてうろうろしていたら、歌って踊れるペチパーさんが迎えに来てくれて、ついでにオフィス入り口でポーズ取ってくれましたヽ(`▽´)/

テーブルついてパソコン立ち上げて、まずは乾杯ww

@mao_sum さんに Vue.js の考え方教わったり、YYPHP のSlack グループ教えてもらったりして、13時からはいろんな方のLT(セッション?)を聞きながら再び勉強タイム。

とりあえず、私が Webエンジニアって名乗るの烏滸がましいなと思いました(´・ω・`)

自分の世界狭すぎ。不勉強が際立っていて、恥ずかしい限りです。ダメだ、勉強しなきゃ。技術書じっくり読み込まなくては…。

 

また来年…!

今回もとても楽しく、とても勉強になったり考えさせてもらったぺちこんになりました。来年も開催されるみたい?!なので、来年は少しは成長した姿でまた皆さんにお会い出来るように、日々経験を積み重ねて行きたいです。

 

最後になりましたが、PHPカンファレンス福岡2018を開催するために尽力してくださったスタッフの皆様、

本当にありがとうございました!m(_ _)m

とても楽しく、大変有意義な時間を過ごすことが出来て、これからの生活の活力をもらいました!

 

よーし、またこれからがんばるぞーー!!

JAWS-UGおおいたの勉強会に参加して来ました

クラウドの勉強会!

  大分にもこんな勉強会あったなんて知りませんでした…orz もっと早く知りたかった。

 jawsug-oita.doorkeeper.jp

Facebook で友達になってる方が、自分は行けないけど是非行ってみて〜と、この勉強会について記事を書いていたのがきっかけで知ることが出来ました。

AWS は、以前案件で導入前試験用に EC2 上にサーバ立てて、一時的に DNS 構築して使ってたくらいしかしたことがなくて、自分で作ったアプリを公開する時に AWS 上に乗せられたらいいなぁ…!と思っていたので、今回参加してみました。

今回は結構初心者向けのお話から、結構でっかいスケールのお話まであって、全然知らない世界のお話を聞けたりして面白かったです。

blog.cvc-lab.com

勉強会は遠方から来ている方も結構居て、懇親会や二次会でも面白い話が聴けてよかったです。モチベーション上がりました。

(各セッションに対してなにか感想言えるほど理解してない本当の初心者なので、各セッションの細かい内容については端折ります………)

 

とりあえず、今 Laravel5.5 で作ってる Webアプリ(全然大したものでないけど)をAWS に乗っけて公開するのが目標です。

まずは t2-micro の無料利用枠でインスタンス作ってサーバ立てる所からですかね。

勉強のために課金は惜しまないつもりではありますが、そうは言っても、

安く済むならその方が良い!\(^o^)/

なんかたまに技術ブログとか見てて云十万とか云百万の請求が来た等々の話を聞いたりするので、そうならないように最低限のルールとかからまずは勉強してから取り掛かりたい所であります……!

 

来週はぺちこん!

そして来週は PHP カンファレンス福岡です!超楽しみです!

phpcon.fukuoka.jp

前夜祭も超行きたかったけど、今回は諦めました……。゚(゚´Д`゚)゚。

でも当日の懇親会、後夜祭は行きます。楽しみだなぁ!

 

Laravel5.5でVue.jsを使うまで

Laravel5.5 で Vue.js を使う

Laravel には Vue.js が標準で入っていると聞いていたので使ってみたいなーと思ってました。デフォルトで入ってると言っても、使うまでにちょびっと準備が必要ですので、その手順をメモします。

ちなみに、本家はこちら。

JavaScriptとCSSスカフォールド 5.5 Laravel


環境

  • Laravel5.5 (Vue.js 2.1)
  • CentOS 6.9


JS の依存解決はNPMを使っている

PHP の依存解決はご存知の通り composer ですが、JS の依存解決は npm を使っているらしい。

開発時点の元としてほとんどのアプリケーションで役立つだろうBootstrapとVueを提供しています。これらのフロントエンドパッケージをインストールするため、LaravelはNPMを使用しています。

composer で言うところの composer.json は、プロジェクトルートに package.json というのがあって、

JavaScriptアプリケーションを構築開始するために役立つよう、vueやaxiosのようなパッケージがデフォルトでLaravelのpackage.jsonファイルに含まれています。自身のアプリケーションの要求に合わせ、package.jsonファイルへ自由に追加、削除してください。

とのこと。

んで、Laravel5.5 のプロジェクト作った時点で Vue.js はすでにpackage.json に含まれていますので、プロジェクトルートで

$ npm install

を叩いてあげればいいんですけど、もちろん npm が入ってないと動きません。

なので、先に npm を入れます。


npm を入れる

そもそも、npm とは Node.js のパッケージを管理するツールのこと。

参考 便利なパッケージ管理ツール!npmとは【初心者向け】 | TechAcademyマガジン

CentOS6.9 に yum で入れます。

参考 node.jsをyumでインストールする(centos6.5) - Qiita

リポジトリは epel を使うとするところが多かったんですが、epel を使って入れると

$ node --version
v0.10.48
$ npm --version
1.3.6

「なんかバージョンがいやに低い……??(´・ω・`)」となって、とりあえず $ npm install 叩いてみてたら、見事にエラー出まくりで2時間くらいハマりました。

んで、多分これはそもそも npm のバージョンが低いな?と思って、nodejs と npm の入れ方を変えました。

参考 CentOSに新しめのnodeをインストールする | ハックノート

$ curl --silent --location https://rpm.nodesource.com/setup_10.x | sudo bash -

で、epel が入ってて途中でトランザクションのコンフリクトが起きたので、そうならないために、

$ pwd
/etc/yum.repos.d

こいつの中にいる、epel リポジトリを使わないように

enabled=0

リポジトリ設定ファイル中のenable をすべて 0 にして、

# yum install nodejs npm

したら、新しめのがインストール出来たようです。

$ node --version
v10.2.1
$ npm --version
5.6.0


npm を使って vue.js を入れる

んで、いざ。

プロジェクトルートで、以下を叩きます。

$ npm install
.
.
.
⚠ The `/home/vagrant/common/project-name/node_modules/pngquant-bin/vendor/pngquant` binary doesn't seem to work correctly
  ⚠ pngquant pre-build test failed
  ℹ compiling from source
  ✔ pngquant pre-build test passed successfully
  ✖ Error: pngquant failed to build, make sure that libpng-dev is installed
    at Promise.all.then.arr (/home/vagrant/common/project-name/node_modules/pngquant-bin/node_modules/bin-build/node_modules/execa/index.js:231:11)
    at process._tickCallback (internal/process/next_tick.js:68:7)
npm WARN ajv-keywords@3.2.0 requires a peer of ajv@^6.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.4: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! pngquant-bin@4.0.0 postinstall: `node lib/install.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the pngquant-bin@4.0.0 postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/vagrant/.npm/_logs/2018-05-26T09_14_31_922Z-debug.log

あるぇ、またエラってる\(^o^)/

✖ Error: pngquant failed to build, make sure that libpng-dev is installed

とりあえずなんか足りないみたいなので、入れてあげる。

# yum install libpng-devel

これ入れてから再度チャレンジ。

$ npm install
npm WARN deprecated gulp-util@3.0.8: gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5

> pngquant-bin@4.0.0 postinstall /home/vagrant/common/project-name/node_modules/pngquant-bin
> node lib/install.js

  ⚠ The `/home/vagrant/common/project-name/node_modules/pngquant-bin/vendor/pngquant` binary doesn't seem to work correctly
  ⚠ pngquant pre-build test failed
  ℹ compiling from source
  ✔ pngquant pre-build test passed successfully
  ✔ pngquant built successfully
npm WARN ajv-keywords@3.2.0 requires a peer of ajv@^6.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: minimist@1.2.0 (node_modules/fsevents/node_modules/rc/node_modules/minimist):
npm WARN enoent SKIPPING OPTIONAL DEPENDENCY: ENOENT: no such file or directory, open '/home/vagrant/common/project-name/node_modules/fsevents/node_modules/rc/node_modules/minimist/package.json.3224473585'

added 120 packages in 64.377s

WARN は出てるけど、とりあえず行ったっぽい。

あともう一息。

$ npm dev run
.
.
.
 95% emitting

 DONE  Compiled successfully in 14075ms                                                         09:22:57
.
.

おお、なんとか終わったっぽい。

$ cd /home/vagrant/common/project-name/node_modules
$ ls
.
.
vue
.
.

ファイルがいっぱい出来てます。こっちにも。

$ cd /home/vagrant/common/project-name/public/js
$ ls
app.js

ふむ。

使い方はよくわかりませんが、それはこれから勉強していくということで。

これで一応、vue.js を使う準備が出来た、のかな…。多分。


参考

Laravel5.5でVue.jsを使ってみた - あ、しんのきです


Lumen5.2からsessionは入ってないらしい\(^o^)/

Lumen5.5 で session 使おうとしたんですけど

自分が趣味で作ってるサイトで、スクラッチで書くのは嫌だけど、重たいフレームワーク使うのもヤダ。なので Lumen5.5 を使おう!

ということで軽量と噂の Lumen でもりもり組み込んでいたんですけれども。

Laravelでやっているように、

HTTPレスポンス 5.5 Laravel

return redirect('/path')->with('flashMsg', '成功!');

って感じでリダイレクトにフラッシュメッセージを持たせようとしました。

そうしたら……

Call to a member function flash() on null

こんなエラーが!

なんだろ……?null から flash() を呼び出してる?そら出来ませんわな。でもなんで null ?と思って色々調べていたら、本家に書いてありました。

本家:Release Notes - Lumen - PHP Micro-Framework By Laravel

As such, sessions and views are no longer included with the framework. If you need access to these features, you should use the full Laravel framework.

「Lumen5.2 から sessions と views はフレームワークに入ってないよ。これ使いたかったらフルスタックなLaravelの方使うべきですね」って………

マジで??(´・ω・`)

フルスタックな必要無いからLumenで〜とか思ったけど、フルスタックな必要あった感じなんですかね。いや、session さえあればいいんですけどね……?

そうか、しかし、session 無いと困ったな。

Laravel でも、いいけど……好きだし。でも、そんな、フルスタックな必要は無いんですって……session はいるけど!


一応回避方法もあるにはあるようですが

lumen 5.2 でもSession使う - Qiita

うーん、公式さんの言う通り、Laravel ………使うか……??

CakePHPでリファクタリングする際にとりあえず見る所

やっぱりDB周りです

今引き継いでやっているプロジェクトがCakePHP2系で、そろそろ△年経つシステムですのでちょこちょこリファクタリングすることもあるのですが。

以前、「別サーバから API を叩きに来るタイミングでLAが凄い上がるのでリファクタリングしましょう」という課題があって以下の事をした時に、LAが10分の1だか15分の1だかになった事があって、「リファクタリング……だいじ………!!」としみじみと思った経験から、CakePHP に限らず DB とのやり取りには気を使うようになったのでした……。

影響範囲が少ない時には、結構他の課題と一緒にやってしまいますが、「処理重くね……?」と思った時にまず見る点を備忘録的にちょっとまとめてみます。

多分、CakePHPer さんにしたら、「え……今更……?」という内容だと思いますががが。

1.データ取得時の recursive 設定

これ超大事。だと思う。

https://book.cakephp.org/2.0/ja/models/model-attributes.html#recursive

そもそものお話ですけど、CakePHPの公式的には、AppModel で recursive を -1 に設定しておきましょうとなってます。

recursive レベルは -1 にしておいたほうがよいでしょう。 こうしておくと、不要な関連データを取得してしまうのを回避できます。 これは、おそらく find() を呼び出すほとんどの場合に望ましい結果になります。 必要な場合にのみ recursive レベルを設定して関連データを取得させるか、もしくは Containable ビヘイビアを使いましょう。

AppModel に次のような設定を追加します。:

public $recursive = -1;

まあね、最初からそうなってればいいんですけどね。なってないんだからしょうがないですよね。

リファクタリングでこれするには、流石に怖すぎて出来ないかなぁ……(;´∀`)

(数えたらモデル94個あった……)

なので、まあ、こういう対応が必要になってくるわけなんですが……。

recursive 設定されていない場合のデフォルトはレベル1です。つまり基本全部の find で recursive がレベル1なわけです。困った。

例えば、10個近いテーブルとリレーション(CakePHPだとアソシエーション)張られてるのに recursive 設定されてなかったりとか、たまに

$array = $this->ModelName->find('all', array(
    'recursive' = 2,
    ...
));

とかなってると「……………\(^o^)/」ってなります。いや、あのね。それね、全部………ぜーーんぶ取ってきてますけど、それホントにいります?ってなります。

いくつもテーブルがぶらさがってて、しかもそれが結構な量だと洒落になりません、マジで。

現に、これで凄まじい重さのことがたまに(結構?)ありました。

特にアクションログのような物まで一緒に取って来てると、天を仰ぎたくなります。

あまり情報要らないのであれば、私は大人しく

$array = $this->ModelName->find('all', array(
    'recursive' = -2,
    ...
));

を設定します。 あるいは、

$this->ModelName->recursive = -2;

ただ、これだと肝心の欲しいデータが取れない時があるんですよねぇ。確かに、便利だからリレーション張ってるのに、それ意図的にちょん切るわけですからね。必要な時に取れないのでは困ります。

そこで出てくるのが、これ。

2.ContainableBehavior

そう、データ取得の際にリレーションが深い所の値が欲しい時は確かにあります。けど、recursive が 2 で深い所のを全部取ってくるのは多すぎる。

という時に、recursive は 2 だけど、その中のこれとこれだけ取ってくる、ということをやります。

$this->User->Behaviors->load('Containable');
$users = $this->User->find('all', array(
    'contain' => array(
        'Post' => array(
            'title',
            'modified',
        ),
        'Profile' => array(
            'age',
            'postcode',
        ),
    ),
));

要は、本当に「必要なものだけ」取ってくるわけですよね。理に適ってます。

でもこれ注意する必要があるのは、リファクタリングの際だと特に「本当は Profile の address も必要だったのに!」って怒られたりすることがあることです。

本当に必要なものがちゃんと取れてるのかは、debug などしてデータをしっかりと確認する必要があるということですかね。

「最初からやってくれれば後から数多あるキーを虱潰しに確認する手間も省けたのになぁ〜!(・∀・)」とかは言ってはいけないのです……。

長く使うつもりで、それでも少しずつ、コードを綺麗に、少しでも早い処理になるように、日々リファクタリングしていかねばなぁ、と思った今日この頃。

PHPカンファレンス福岡に申し込みました

2018年6月16日(土)!

PHPカンファレンス福岡が今年も行われるそうです!ドンドンパフパフ!

phpcon.fukuoka.jpカンファレンスや勉強会がもう、ホント、好きで。去年初めて行ったのですが、去年もすごく楽しかったです。去年はブログを持っていなくて、「ブログに書くまでがカンファレンスです」って言われていたのに、「なん……だと……(・・;)」となったのも記憶に新しい。

もう1年経つそうです。速い。

カンファレンスの何が楽しいって、まだPHPer 3年目のぺーぺーにとって、同じ戦場で戦う人たちがこんなに居るんだなって思ってなんだか妙にわくわくしたし、ララベラーに会えて嬉しかったし、色んな人達の、この業界が熱いとかあのジャンルが今度絶対流行るとか、面白い話を身近で聞けて、疑問に思った事をその場で聞けて、凄いモチベーションアップにも繋がりました。

もちろんセッション聞いて勉強するのがメインの目的ですが、でも私の中ではそれは目的の内の50%くらいの割合で(スミマセン)、もう半分はやっぱり前夜祭とか懇親会とか後夜祭でわいわい皆さんとお話出来るのがもう、楽しくて。

PHPカンファレンス福岡2018の実行委員長さんなんかもおっしゃってますけど、まさに「大人の文化祭」みたいで、ようはお祭りなんですよね。

tech.innovator.jp.net

てな事で、もう申込みが出来るようだったので早速申し込みました。もちろん同日同会場で行われる懇親会も!

前夜祭や後夜祭も今の所2つ確認しているので、どちらかには必ず行きたい。どっちも行ってみたいけど、体力が持つかなー……。

 

今年は東京は12月15日(!)みたいですし、こっちもまた行きたい(餃子食べに)。

qiita.com今年は福岡移住する計画もあるし、ドイツにも行ってきたいし、楽しい1年にしたいなー(もう4月ですが)。