ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

CakePHP3系のController内で関数を定義してガンガン使っていく方法

こんにちは!
ユアマイスターエンジニアインターンの高梨です!

では、前置きなしで早速始めていきます!

今回の概要

  • Cakephp3系のController内で自分で好きな関数を定義する。
  • 定義した関数をガンガン使っていく。

内容

例えば、記事とランキングを取得するための
こんなコードがあるとします!

class ArticlesController extends AppController
{
  public function index()
  {
    //記事を全て取得
    $articles = $this->Articles->find('all');
    $this->set(compact('articles');

    //色々処理してランキング取得
    $ranking = ・・・
    $this->set(compact('ranking'));
    
  }

  public function detail($id)
  {
    //idから1記事取得
    $article = $this->Aritlces->get($id);
    $this->set(compact('article'));

    //色々処理してランキング取得
    $ranking = ・・・
    $this->set(compact('ranking'));

  }

}


この時、ランキングを取得する処理が完全に同じ
コードになっていますね!

これを切り出して
1つの関数を作るやり方が
こちらになります。

class ArticlesController extends AppController
{
  public function index()
  {
    //記事を全て取得
    $articles = $this->Articles->find('all');
    $this->set(compact('articles');

    //ランキングをセット
    $this->setRanking();
    
  }

  public function detail($id)
  {
    //idから1記事取得
    $article = $this->Aritlces->get($id);
    $this->set(compact('article'));

    //ランキングをセット
    $this->setRanking();

  }
 
 //今回作った、ランキングをセットする関数
  private function setRanking()
  {
   //色々処理してランキング取得
    $ranking = ・・・

    $this->set(compact('ranking'));
  }

}



これがController内で
関数を定義し、
実際に使うやり方です。

もちろん引数を与えてあげることも可能ですし、
returnで値を返すことも可能です!

同じコードを何回も書くのは好ましくないので、
こんな感じで外側に切り出して使うようにしましょう!

この方が後々修正もやりやすいですし、
同じコードをまとめておくことで
他の人も見やすいですからね!

では、今回は以上です!
ご覧いただきありがとうございました。



※privateについて補足

publicは外部からアクセス可能なメソッドで、
privateはclass内からしかアクセスできないものです。

ここでいう、indexアクションとかは
外部からアクセスする必要があるので、
publicにしておきます。

逆にsetRankingは外部からアクセスする必要がないので、
また、してほしくないので、
privateにしていますね。

ここでは簡単な説明にとどめておきます!
では、また次回。

Webエンジニアが最低知っておくべきKPIとサービスを成長させるための考え方

エンジニアの石川です。

Webサービスって、どうやったら商売として軌道に乗るんだろう、と思ったときにエンジニアにできるはじめの一歩を書いてみたいと思います。

エンジニアの仕事ってなんだろう

私はエンジニアなんですが、ノリで生きてきたためにちょっとだけデザインやグロースハックなどにも片足を突っ込んできました。

だいたいはBtoCのWebなんですが、アプリやBtoB、ExcelVBAでのマクロ開発までつまみ食いをしながら全力疾走している毎日です。

「自分、Webエンジニアです」と名乗る輩は掃いて捨てるほど世の中にいるわけですが、「Webプログラマ」や「コーダー」との違いってなんなんでしょうか。

私は「自分の持っている技術を使って 主に技術面から 事業を成長させる手伝いをする人」だと思っています。

対してプログラマーやコーダーは「自分のタスクを達成すること」に主眼が置かれている気がします。

「事業を成長させる」ための技術はなるべくたくさん持っていないといけない、と私は考えています。

サービスに携わるエンジニアが意識すべきこと

ユアマイスター株式会社では「あなたのマイスター」というWebサービスを開発・運営しています。

yourmystar.jp

Webサービスというものを事業(商売)として成立させるためには、大きく3つの点に着目しなくてはならないと思っています。

集客・転換・単価 です。

  • 集客
    • サービスにいかに人を集めるかということ
      • 会員制でないtoCのサービスの場合は以下の方法などがあります
        • 自然検索(Organic)
        • Web広告
        • SNS
        • オフライン(TVでのCMやチラシなどWeb外から集客する)
  • 転換
    • サービスに来てくれたユーザにいかにサービスを利用してもらうか
      • サービスの形態によって定義が変わります
        • 会員登録や購入、送客など
    • ユーザ一人あたりどの程度の確率で転換するかを 転換率(CVR) と呼びます
  • 単価
    • 文字通り、1ユーザが転換したときの単価

この3つの指標を伸ばすことができれば、サービスの売上は伸びます。

KPI(Key Performance Indicator) として設定されることが非常に多いですね。

※KPIとは、ざっくり言えば事業において常に監視するべき重要な指標のことです

上記のKPIに対してエンジニアができること

エンジニアの業務でのアプローチのしやすさは

転換 > 集客 > 単価

である場合が多いです。

転換率 は、サイト内のUI/UXを改善することでユーザの購買意欲を向上することで改善することができます。

例えば、商品を検索するのに毎回1分待たないといけないとしたら、ユーザは諦めて離脱してしまいます。

検索速度を上げることでユーザの離脱率を低下させ、結果として転換率の上昇に寄与することができます。

その次の 集客 では、主にSEO対策やSNSへのシェアのしやすさなどを向上することでアプローチできます。

表示速度改善やマークアップの最適化、シェアボタンの設置などでしょうか。

最後に 単価 ですが、ここへのアプローチはクロスセルやアップセルを狙ったレコメンドが考えられます。

  • アップセル
    • より高いものを購入してもらうこと
      • 現在選択されている商品に対して、より付加価値が高く単価の高い商品を提示することで実現することが多い
  • クロスセル
    • あわせ買いをしてもらうこと
      • 現在選択されている商品に関連性の高い商品を提示することで実現することが多い

これらの考え方を常に意識して開発に臨むと、「これって本来必要ないよな」とか「もっとこうした方がいいな」といったことが自然と浮かぶようになります。

よりお客様に愛されるサービスを作るために、広い視野を持って開発に携わりたい!!というエンジニアの方がいらっしゃれば、ぜひともご一報ください。

www.wantedly.com

www.wantedly.com

コードを日本語で読もう

こんにちは。エンジニアインターンの土屋です。
コードを日本語で読む大切さ。前回もそんな記事を少し書いた気がしますが、具体的にどう読んでいくのか。。
例えばこんなメソッドがあったとします。
条件は、

  • テストの質問に対する答えを紐づけて検索し取得する

  • 新しい質問が一番最初に来るように検索する

   public function findTestQuestionsHaveTestAnswers(Query $query, $option) {
  $query
    ->where(['product_id' => $option['productId']])
    //引数で指定されたproductIdとproduct_idが一致した場合
    ->andWhere(['id IN' => $option['TestquestionIdHasTestAnswer']])
    //かつ引数で指定されたTestquestionIdHasTestAnswerのいずれかがidと一致した時
    ->order(['registration_num' => 'desc', 'TestQuestions.created' => 'desc']);
    //昇順にregistration_numを並び替え、registration_numが被ってしまった場合TestQuestions.createdの昇順に並べる
    
    return $query;
}

コードが日本語で読めることの大切さ

  • 曖昧なコードを書かずにすみ、バグの原因にならない
  • 意味を理解しているため、他人に1行で何をしているのか明確に説明できる
  • みんなが理解できるコードになるため、読みづらいコードにならない

    私もまだまだコードを読むことができていません。
    ぜひ、エンジニア初心者の方やインターン生の方がいたら、声に出して読んでみてください!
    なかなか読めないし、日本語で表すのが難しいことを実感します。。。


    おまけ
    降順(DESC)と昇順(ASC) があり、降順は値が大きいものが一番最初。逆に「1、2、3….」と値が増えていくのが昇順です。
    ASCは同じ「あ」と言う発音始からまるUP(アップ)。なので、1、2、3…となる。って覚えるといいよ!! と、偉大なエンジニアの方に教えてもらいました!
    よく使うので覚えるときに便利です!

    以上、土屋でした。

6/14 アップデートのお知らせ

6/14に以下の機能のアップデートを行いました。

その他、軽微なバグ修正も同時に行いました。

詳細は以下の通りです。

1. 検索結果画面に直近7日間の空き状況を表示しました。

f:id:yourmystar_engineer:20170614194529p:plain ※パソコンサイトにも同様の機能を追加しました。

お客様がお探しのサービスに辿り着きやすくなるよう、検索の条件を絞り込みながら

空き状況をご確認いただけるように一覧表示を行いました。

人気のマイスターはなかなか空き状況がない場合もあるかと思いますが、

空き日程条件を指定して、再検索をお試しください。きっとお探しのマイスターに出会えます。

なお、検索条件を指定するためには、

f:id:yourmystar_engineer:20170614195032p:plain

画面上部の「虫メガネ」のマークをタップしてください。

yourmystar.jp

以上です。

あなたのマイスターでは、お客様のお声を元に、一層の機能・UIの改善に努めてまいります。

今後ともどうぞよろしくお願い申し上げます。

WordpressのREST APIで記事の総件数を取得する方法?

こんにちは!
ユアマイスターインターンの高梨です。

最近Wordpressをよく使うようになったので、
その中で少し調べるのに手間取った
REST APIで記事の総件数を取得する方法」
について書いていきたいと思います。

やってみたらやり方はかなりシンプルでした。

概要

APIをたたくときのHeader情報に
記事の総件数が含まれているので、
それを取ってくるだけです!

手順

1.Wordpress REST APIをたたくURLを用意
2.用意したURLのHeader内容を取得
3.取得したHeader内容から記事数を取得

順番に説明していきます。

1.Wordpress REST APIでたたくURLを用意

APIを使う際に、URLをたたいて
情報を持ってくると思います。

例えばこんな感じですね。

http://example.com/sample/wp-json/wp/v2/posts/?search=サンプル



この場合は「posts」というメソッドに
「サンプル」という言葉を検索するクエリパラメータを
付けています。

今回はこれでヒットする記事の件数を
取得していきます。
(サンプルで検索してヒットする記事の件数)

2.用意したURLのHeader内容を取得

1で作ったURLのHeader情報を取得していきます。
ここではPHPでコードの例を上げますね。

get_headersという関数を使うと
URLからHeaderの情報を取得することができます。
(※get_headersについては最後に補足します。)

$url = "http://example.com/sample/wp-json/wp/v2/posts/?search=サンプル";
$headerArray = get_headers($url, 1);



これでとれる結果がこんな感じです。

[
(int) 0 => 'HTTP/1.1 200 OK',
'Date' => 'Sun, 20 Jun 2020 00:00:00 GMT',
'Server' => 'Apache/2.2.31 (Amazon)',
'X-Powered-By' => 'PHP/5.7.1',
'X-Robots-Tag' => 'noindex',
'Link' => '<http://example.com/sample/wp-json/wp/v2/posts/?search=%E3%83%97%E3%83%AD>; rel="next"',
'X-Content-Type-Options' => 'nosniff',
'Access-Control-Expose-Headers' => 'X-WP-Total, X-WP-TotalPages',
'Access-Control-Allow-Headers' => 'Authorization, Content-Type',
'X-WP-Total' => '128',
'X-WP-TotalPages' => '13',
'Allow' => 'GET',
'Content-Type' => 'application/json; charset=UTF-8',
'Connection' => 'close'
]



これでほぼわかりますね!
この'X-WP-Total'のvalueが
検索で引っかかる総記事数です!

3.取得したHeader内容から記事数を取得

最後に記事の総件数を取得するコードが
これになります。

$url = "http://example.com/sample/wp-json/wp/v2/posts/?search=サンプル";
$headerArray = get_headers($url, 1);
$articlesNum = $headerArray["X-WP-Total"]; //記事の総件数を取得



意外と簡単でしたね。

これで、記事の情報すべて持ってこないでも
検索にヒットする件数をピンポイントで取得できます!

他にも'X-WP-TotalPages'のvalueが
ページ数になっているので、
そっちも簡単に取得できます。
(defaultでは1ページ10記事)

ここまでが
WordpressREST APIで記事の件数を取得する方法」
でした。

ご覧いただきありがとうございました。

※補足

get_headersについて少し補足します。
今回使用した際に、

$headerArray = get_headers($url, 1);



というふうに、
謎の1を引数に入れています。

get_headersという関数では、
第二引数に0以外をセットすると
それぞれのレスポンス情報が
Keyとしてセットされるみたいです。

今回の取得例で比較してみると、
以下の感じです。

get_headers($url)の場合

[
[0] => 'HTTP/1.1 200 OK',
[1] => 'Date: Sun, 20 Jun 2020 00:00:00 GMT',
[2] => 'Server: Apache/2.2.31 (Amazon)',
[3] => 'X-Powered-By: PHP/5.7.1',
[4] => 'X-Robots-Tag: noindex',
[5] => 'Link: <http://example.com/sample/wp-json/wp/v2/posts/?search=%E3%83%97%E3%83%AD>; rel="next"',
[6] => 'X-Content-Type-Options: nosniff',
[7] => 'Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages',
[8] => 'Access-Control-Allow-Headers: Authorization, Content-Type',
[9] => 'X-WP-Total: 128',
[10] => 'X-WP-TotalPages: 13',
[11] => 'Allow: GET',
[12] => 'Content-Type: application/json; charset=UTF-8',
[13] => 'Connection: close'
]



get_headers($url, 1)の場合

[
(int) 0 => 'HTTP/1.1 200 OK',
'Date' => 'Sun, 20 Jun 2020 00:00:00 GMT',
'Server' => 'Apache/2.2.31 (Amazon)',
'X-Powered-By' => 'PHP/5.7.1',
'X-Robots-Tag' => 'noindex',
'Link' => '<http://example.com/sample/wp-json/wp/v2/posts/?search=%E3%83%97%E3%83%AD>; rel="next"',
'X-Content-Type-Options' => 'nosniff',
'Access-Control-Expose-Headers' => 'X-WP-Total, X-WP-TotalPages',
'Access-Control-Allow-Headers' => 'Authorization, Content-Type',
'X-WP-Total' => '128',
'X-WP-TotalPages' => '13',
'Allow' => 'GET',
'Content-Type' => 'application/json; charset=UTF-8',
'Connection' => 'close'
]



今回の場合、
「128」という記事の総件数がほしかったので、
値をkeyとvalueに分けました。

もう少し詳しく知りたい方は
PHPの公式リファレンスを見てみてください。

PHP: get_headers - Manual

CakePHP 3.4.7 の ServerRequestFactory の extract() でハマったブログを書いたら、有志の方が修正プルリクを送ってくれました。

yourmystar-engineer.hatenablog.jp

昨日書いたこの記事ですが、一晩で有志の皆様付近で盛り上がり、なんとプルリクを送ってくれた方がいらっしゃいました。

github.com

しかもすでに、3.4.8には入りそうな様子。

f:id:yourmystar_engineer:20170613215018p:plain

ありがとうございましたっ!!(心から)

@slywalkerさんにお会いしたことはないですが、どこかの機会でいつか直接お話したいと心から思います。

自分でプルリク送るところまでセットで盛り上げられなかったのが悔やまれるところですが、

次回同じような目に会った時には必ず自分もコミュニティーに貢献できるようになりたいと思います。

ネットっていいですね。会ったこともない人に、感謝の気持ちを抱けるし、自分への奮起のきっかけになるなんて。

APIを知らなかった私が実装できるようになるまで学んだこと

こんにちは。エンジニアインターンの土屋です。
今日はAPIの実装の流れについて書きたいと思います。
また、1から実装していく中でプログラミングにおいて大切だと学んだことがあります。
是非、エンジニアインターン、初心者の方は参考にして欲しいです。

APIとは。。?

API(アプロケーションプログラミングインターフェース)とは、プログラムの関数の様なもの。プログラムからソフトウェアを繋ぐためのインターフェースです。

まずインターフェースとは何かと言うと、「何かと何かを繋ぐもの」簡単に言えば自動販売機の様なものです。

人とその人が欲しい飲み物を繋ぐもので、お金を入れて飲みたいジュースのボタンを押すだけで飲み物が出てくる

f:id:yourmystar_engineer:20170612231309p:plain

同じ様にAPIは「アプリケーションに情報や指示を出してプログラミングしてくれる」ものです。

request定義

APIを実装する際には、手順があり、私のようなエンジニアインターンやエンジニア初心者の方は書いてみるといいと思います。 request定義はフォーマット(どのような形でデータを送信するか)とURLを決めます。APIのフォーマットではXMLまたはJSONがスタンダードになっています。

response定義

response定義では実際に返したい値を決めたフォーマットの形でかき、画面に出力したいデータを決めておきます。
正常値だけではなくて、エラー値も決めておきます

    {
          "result": 400,
          "reviews" []
    }

設計

  1. リクエストパラメータを受け取る

  2. リクエストのnullチェック
    ・ リクエストパラメータで受け取った値が存在しているかチェックを行う

  3. 形式チェック
    ・ 値がどんな形式で入ったら正常なのかチェックを行う

  4. DBを検索
    ・ 画面に表示したいデータから対象テーブルを洗い出す
    ・ そのデータを取ってくる際に検索する条件を設定
    ・ 取得件数を設定する

  5. Jsonに詰め替える

  6. Jsonデータを返却する

その後、実際に実装して行く流れになります。

プログラミングにおいて大切なこと

APIを実装していて、プログラミングをする上で大切なことを学びました。
・日本語でコードをしっかり読めること
・感覚でやらないこと
・問題点を絞っていく力を身につけること
コードを日本語で読むことができたら書ける。その通りだなと思いました。感覚でふんわりとしかコードが読めていないと曖昧なコードになってしまって、結果エラーやバグの元になってしまう。一単語の一単語の意味を理解することが思っている以上に難しい。。。流すことなく1行のコードと向き合っていくことを意識する!今後も私の課題です! 以上、土屋でした!