読者です 読者をやめる 読者になる 読者になる

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

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

監視モニターを設置しました

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

本日は、ある意味リリース報告です!

f:id:yourmystar_engineer:20170526213335p:plain

ユアマイスターにサービスの監視モニターを導入しました!

システム監視をMackerelで、サービスのアクセス数確認をGoogle Analyticsでやっているんですが、

いつもブラウザのタブ切り替えや再読み込みをし続けることが面倒になってきたところでした。

エンジニアの島の近くにディアウォールと2x4の材木で壁に傷をつけることなく設置完了!

顔をあげれば、一目でサービスの稼働状況が確認できるため、エンジニアのみんなの意識も高まるはず(?)

いずれにせよ、自分はこれで一つの手間から解放されたので幸せです。

今度はMackerelの話を書こうかなと思ってます!

そして告知です。

【起業を目指している方・スタートアップに興味のある方必見!!】

近年スタートアップへの投資も増え、メディアがスタートアップを取り上げる数も増えたため、毎日のようにその動向を見るようになった。 今回のイベントではユアマイスターCTOを務める星永亮氏とネットジンザイバンキャピタリスト兼エンジニアの戸村憲史氏がパネルディスカッション形式で、「スタートアップへ挑戦する意義」を中心に「なぜスタートアップへ転職したのか?」、「スタートアップへ挑戦してやりたいことは何か」等、その実情を語ります。 スタートアップに興味がある方や今後起業を考えている人、または起業の仲間集めしたい方などにお勧めのイベントとなっております。 今回、東京都と(公財)東京都中小企業振興公社が連携して設立した東京創業ステーション内「Startup Hub Tokyo」にて、ネットジンザイバンクがイベントの企画開催運営を行っております。

connpass.com

今度、東京駅近くの「Startup Hub Tokyo」で元ietty CTOの戸村さんとお話しさせていただけるチャンスがあります!

一生に一度あるかないかの貴重な機会なので、全力で楽しみたいと思います。

星の小さな経験が、少しでも誰かのためになるのであれば、それだけで嬉しい!

はじめてのJSONで学んだこと

JSONから学ぶ

こんにちは、開発インターンの小磯です。先週新たなプロジェクトに参加することができ、その中の一つのタスクとしてJSONを扱う機会がありました。初めて扱うので自分なりにまとめてみました。

JSON

  • JavaScriptの中でオブジェクトを記述する書式のこと。
  • “表"形式では表現が困難な構造のデータをコンピュータに伝達する記法。

これだけではイメージが掴みづらいので、自分の理解は以下の通りです!

  • 情報を格納しておいて取り出せるようにする、データベースの簡易版。
  • 配列・連想配列によって情報を整理する。

なので、JSONの書式でファイルを作成するには配列・連想配列の理解が必要になります。

配列

  • arrayと呼ばれる。
  • 情報=要素を[ ]でくくる。
  • 配列名=[ ]のように配列に名前をつけることで、配列名[]で配列内の情報を利用することができる。

例)

array1=[1, 2, 3, 4, 5] 

↑配列内に1, 2, 3, 4, 5の情報が存在する。

連想配列

  • 情報を{ }でくくる。
  • 配列ないの要素(value)にkeyをつけることで情報を整理して格納する。
    • 例) array2 = { key = value }

また配列・連想配列ないでは以下のような条件があります。

 条件

  • 文字列情報は" “でくくる。
  • 数字、真偽値情報は" “でくくる必要はない。

これらの前提項目を踏まえてJSONの実例をみてみます。

"product_info":{

"name":"bread",
"address":"Tokyo",
"price":180,
"sale":30

}

実例解説

  • JSONでは命名の際に英小文字とアンダーバーを用いる。

    “product_info”:{

  • JSONでは:(コロン)が=の意味を表す。
  • 全体はproduction_infoという名前を持った連想配列
  • 連想配列内のkey要素
    • name,address,price,sale
  • 連想配列内のvalue要素
    • bread,Tokyo,180,30

うまくまとめきれてないような、、 勉強してまいります。

検索改善 Elasticsearchでハマった沼

ユアマイスターエンジニアです。

弊社サービス「あなたのマイスター」では、モリモリとサービス改善を実施中です。

http://yourmystar.jp/

ある日、社内で誰かがつぶやいたんですよ。

「検索、遅くね?」

知っていた、知っていましたとも!

「なんかAm◯zonみたいなキーワード検索とかできないのかな」

エンジニア以外にはわからないかもしれないけどけっこう大変なんだよそれ!

しかし、きっとこの改善を達成すればお客様も喜んでくれるはず…

その思いからなんやかんやあって検索を全文検索エンジンであるElasticsearchへ切り替えました。

情熱って大事。

第一の沼

とりあえずCakePHPからも公式でプラグインは出ているみたいだし、楽勝だろうという思いでいたのですが…

ElasticSearch

どうもこの方法でインストールするプラグインは導入時の最新バージョンのElasticsearchに対応していない様子。

結果として「全件取得以外は何をやってもエラーになる」という悲しみに包まれました。

これに気付くのに2日かかったよ…なにやってもダメなんだもん…

というわけで公式リファレンスを読みながら

www.elastic.co

なんとか自前のコンポーネントを作りましたとさ。めでたしめでたし。

第二の沼

Elasticsearchって結局のところJSONでデータを出し入れするわけですが

{
  "users" :
    [
      {
        "id" : 1,
        "name": "ゆあまい すたろう",
        "tel": [
                  {"number": 09000000001},
                  {"number": 09000000002}
                ]
      },
      {
        "id" : 2,
        "name": "ゆあまい すたこ",
        "tel": [
                  {"number": 09000000003},
                  {"number": 09000000004}
                ]
      }
  ]
}

こういうデータの「電話番号だけを更新したい、ってことあるじゃないですか。

例えば「09000000004」「09000000005」「09000000006」の3つに強制的に変更するとします。

つまり、配列内の要素のみをUPDATEしたい場合ですね。

この際に、ハマりました。

www.elastic.co

Elasticsearch 2.x で複数のドキュメントにUPDATE文のようなもの実行する – wired-world

こんな感じで書いてあるもんだから

{
  "script": {
    "inline": "ctx._source.users.tel = 
        [
         {\"number\" : 09000000004},
         {\"number\" : 09000000005},
         {\"number\" : 09000000006}
        ]"
  }
}

ダメでした…

正解は

POST XXX/_update_by_query
{
  "script": {
    "inline": "ctx._source.users.tel = 
      [
        [\"number\" : 09000000004],
        [\"number\" : 09000000005],
        [\"number\" : 09000000006]"
      ]
  }
}

おいおい…配列内のオブジェクトはカギカッコでくくるんですか…そうですか…

公式リファレンスをざっと読んだ限りは見当たらなかったです。

第三の沼

OR検索をするときには should 句を使うんですが、

www.elastic.co

このときには minimum_should_match も同時に設定してあげなければなりません。

「最低◯個は合致しないとダメだよー」的な感じのパラメータですね。

通常のOR検索の場合は "minimum_should_match" : 1 となります。

(1個以上該当すればいいので)

しかしながら!shouldの条件を一つも指定せずに "minimum_should_match" : 1 とした場合どうなるか…

エラーにはならず、1件も取得できません。

気をつけましょう。私はボスに坊主にされるところでした。

実際の改善結果

速度的には50〜100倍ほどの速度になりました。

界王拳もびっくりなインフレ具合です。

まだまだチューニングする余地はたくさんあるので、今後も技術を通してお客様に価値を提供できたら良いな!と考えています。

CSV ImportをPHP Unitでテストするには?

初めまして、Yourmystarインターンの高梨です。
今回は自分が詰まったCSV Importのテストコードについて
書いていきたいと思います。

前提

CakePHPで、CSVファイルのImportをするための
Componentに対して
実際に実行したテストコードの結果を書いていきます。

やり方

概要としては、AWSのS3にCSVファイルを置いておいて
それを取ってくるという方法で行いました。

ステップとしては、
1.AWSのS3に置いておいたCSVデータを取得。
2.パスに入ったCSVデータをファイルに保存。
3.保存したファイルを使ってテストを実行。
4.最後に作ったファイルを削除。
という流れです。

ポイントは2番の
パスに入ったCSVデータをファイルに保存し直す
というところですね。

Componentの方でどういった処理をされているか
にもよりますが、
今回テストしたかったCSV Import用のComponentでは、
ファイル読み込みの際に、

  • fopen
  • is_file

などのファイルに対する関数を使用していたため、
本番同様の処理をさせるためにはパスではなく、
ファイルを読み込む必要がありました。

(というかパスではうまくいかなかったですね。。。
ファイルとパスの違いを思い知らされました。)

そのため、パスに入ったCSVデータを
ファイルに保存し直す必要があったわけです。

実際のテストコードはこんな感じです。

public function setUp()
{
    parent::setUp();
    $registry = new ComponentRegistry();
    $this->CsvImport = new CsvImportComponent($registry);
    $this->S3 = new S3Component($registry);
    $this->TestModel = TableRegistry::get('TestModel');
    $this->bucket = Configure::read('S3.bucket');
}

public function testCsvImport() {

    //1.S3に置いておいたCSVデータを取得。
    $this->S3->setClientConfig($this->bucket);
    $csvObject = $this->S3->getObject('test.csv');
    $csvPath = $csvObject['@metadata']['effectiveUri'];

    //2.パスに入ったCSVデータをファイルに保存。
    $csv = file_get_contents($csvPath);
    $filename = 'test.csv';
    file_put_contents($filename, $csv);

    //3.保存したファイルを使ってテストを実施。
    $result = $this->CsvImport->importFunction($filename, $this->TestModel);
    $expected = ['csvが読み込まれました。'];
    $this->assertSame($result, $expected);

    //4.最後に作ったファイルを削除。
    unlink($filename);
}

これが最善の方法かはわかりませんが、
Error, Warnningが出ることもなく、
無事CSV Importのテストを実行できました!

もし同じようなことをやりたい時はぜひ参考にしてみてください。

また、もっと効率のいいやり方を知っている方は、
ぜひ教えていただけると大変嬉しいです。

では、今回はここまで!

以上、CSV Importのテストコードの書き方でした!

ここまでご覧いただき、
ありがとうございました!

ネットワークの理解

みなさんコンバンワ!エンジニアインターン生の竹本です! 最近はいかがお過ごしでしょうか??竹本は二週間前くらいに風邪を引いてから持病に苦しんでる日々でございます。照
さて、最近の弊社では、エンジニアインターン生だけで行うプロジェクトが始動し、普段と同様にコードを書くだけでなく企画書や設計書に励んでおります。 そして全て自分たちによって開発していかなければならない中で壁になるのがインフラ部分。。普段の言語を書くのと違って概念的な部分からインターン生は学んでいるのであります。 なので、自分の復習の意味も込めて今日はプロトコルってなに?ってところからやって見ましょう。エンジニアをバリバリにやってる人は私の認識の間違いを指摘していただけると幸いです。 それでは行きましょう!竹本のエンジニアブログ!

プロトコルってなんぞや

そもそもプロトコルってなんぞやっていうのが一般人だと総意ですよね。 IT用語で調べてみると

  • 対象となる事項を確実に実行するために手順を定めた規定、取決めのこと。

  • IT用語では「ネットワークプロトコル」「通信プロトコル」などと使われる。 んーあまりイメージができない。 そこでみなさんがよく見かけるのだと、例えば弊社の運用サイトであれば

https://yourmystar.jp/

このhttpsの部分がプロトコルって言われる部分です。

httpってなに

httpとはHyper Text Transfer Protocolの略です。なんやそれ? Hyper Text とは簡単にいうと皆さんのパソコンに表示されるwebサイトのコンテンツです。パソコンからサーバと言われる膨大なデータから私たちの欲しい情報を選別して持ってきてくれるものに接続する際にhttp形式のものを持ってきてねというサインのようなものだと考えていただけるといいですね。webサイトを閲覧するときにはこのhttp形式か、httpより強セキュリティのhttpsなどを利用します。 この他ですとざっと以下のようなものもプロトコルの一種です

  • FTP(File Transfer Protocol) : コンピューター間でファイルのやりとりを行いたいときに使用するプロトコル

  • SMTP(Simple Mail Transfer Protocol) : Eメールなどを送信するときに使用するメール送信用のプロトコル

  • POP (Post Office Protocol) :  ユーザーがメールサーバーから自分のメールを取り出すときに使用する、メール受信用のプロトコル

みなさんのとても身近なところにプロトコルっているもんですよね。 普段耳にするけど実態がよくわからないIT用語ってたくさんありますが、調べてみると意外と面白い発見があるかもですよ! 以上今週の竹本のエンジニアブログでした!

mixpanelでfunnel分析を使う

こんにちは!マーケターの日高です。

今日はmixpanelの注目機能の一つ、ファネル分析について書きます。

まずファネル分析とは何か? 会員登録や購入に至るプロセスを、アクションまたはページごとに分解し、 どこでユーザーが離脱しているのかを可視化する分析手法です。

例えば、入力フォームのどの項目でつまづいているのか?など、離脱の原因となっているものを把握しやすいです。

どうやるの?

手順はざっくり以下の2つ 1. 会員登録や購入に至るプロセスごとにイベントを発行 2. ファネル分析設定画面で、発生するイベント順にファネルを設定する

やってみよう

測定したい各画面に以下のようなコードを設置し、入力画面→確認画面→完了画面のそれぞれの画面遷移時に

イベントが発行されるように設定しましょう。

‘ mixpanel.track( “ページを見た”, {“画面名”: “入力画面”} );’

‘ mixpanel.track( “ページを見た”, {“画面名”: “入力内容の確認画面”} );’

‘ mixpanel.track( “ページを見た”, {“画面名”: “登録完了画面”} );’

次に、mixpanelのメニューから、Funnelsを選びましょう。

f:id:yourmystar_engineer:20170517115624j:plain Step1のセレクトボックスで入力画面閲覧イベントを、 Step2, 3のセレクトボックスで確認画面, 登録完了画面の閲覧イベントを選んで、 saveボタンをクリックします。

出来上がり

f:id:yourmystar_engineer:20170517120051j:plain

サンプル画像のような分析ができるようになりました。 左から入力画面、確認画面、完了画面へ到達した割合を示します。

ここから読み取れることの1つのは、せっかく確認画面へ到達しているユーザーのいくらかが、 完了画面へ到達していないことです。これは非常にもったいない。

何がネックになっているのか調べて、テストして、改善していきたいと思います!

以上です!

AWSでcronが時間通り動かない!

そんなお悩みをお持ちのあなた、朗報です。あっという間に解決です。

半袖でこんにちは、ユアマイスターの星です。

こんなお悩みをお持ちのあなたへ

  • 0 3 * * * /path/to/shellってcrontab指定しているのに、AM11時に実行される

タイムゾーンを確認する

まず、サーバのタイムゾーンを確認しましょう。

cat /etc/localtime

バイナリーファイルなので文字化けして表示されますが、最後のJSTとかUTCとか出てくるので把握はできると思います。

diff /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

という感じで、差分がないことで一緒だ!と判断する方法もあります。

もしタイムゾーンJSTになっていない場合は、

Amazon EC2のタイムゾーンを日本時間に変更する方法 - Qiitaあたりを確認しながら設定しましょう。

crondを再起動する

タイムゾーンJSTになっているし、dateコマンドを打っても正しい時間が出てくる!という場合は、 crondを再起動することで解決します。

sudo service crond restart

あまり出番のないTipsかもしれませんが、後学のために。