うちのいぬ Tech Blog

Tech Blog of Uchinoinu/My dog

3Dアプリの行動履歴ログを獲得する為に参考にした資料の備忘録

qiita.com

経緯

とあるサービスでユーザーの行動解析を行う際に、ログデータを受け取ってなるべくリアルタイムに加工して出力するシステムが必要になったので、どう構築していくか調査することになりました。 その際にとても有用だと感じた資料を残しておきます。備忘録です。

概要

ログ管理のベストプラクティス

AWS Japanのソリューションアーキテクトの方の資料です。AWSを使う場合にはたくさんの定石を知ることができて役立ちました。

秒間数万のログをいい感じにするアーキテクチャ

  • Cookpadのログへの考え方からシステムの変遷まで書かれていて、ログというものへの全体像を実感するのにとても役立ちました

AWS summit 2016 Tokyo 発表内容】タウンワークにおけるサーバーレスアーキテクチャデザイン

サーバーレスアーキテクチャのパターン別ユースケース

各要素

Kinesis

データの一時受けに便利です。KinesisはStreamsとFirehoseとAnalyticsの3つのサービスにわかれています

Kinesis Streams

Kinesis Streamsの公式ページで、結局ここが一番わかり易いです。 diagram-kinesis-streams-how-it-works.png

Kinesis Firehose

Kinesis Firehoseの公式ページがとてもわかり易いです。 diagram-kinesis-firehose-s3-redshift-elasticsearch_v2.png

Amazon Kinesis StreamsとAmazon Kinesis Firehoseは何が違うのか

Amazon Kinesis StreamとAmazon Kinesis FirehoseのAPIを比較する #reinvent

AWS Kinesis Firehoseを動かして見る

KafkaとAWS Kinesisの比較

AWS以外のサービスとの比較、AWSにとらわれないシステム構成などを学ぶことができました

fluent-plugin-kinesisでKinesis Streamsにログを送信する

実用例としてとても参考になりました。

fluent-plugin-kinesis-firehoseでAmazon Kinesis Firehoseにログを転送する

のfirehose版で、こちらも参考になりました。

結合例

ストリーム型(kinesis stream)のAWS Lambdaの同時起動数とデータの取り方を整理

Kinesis Streams と Lambda との組み合わせ方について勉強になりました

Fluentd&Kinesis&Lambdaによる柔軟で高可用性なログ収集基盤の構築

  • Fluentd -> Kinesis -> Lambda -> [S3, DynamoDB...] などの流れが明快にわかってとても参考になります

API Gateway / Lambda / Kinesis を使ったストリーミングなバッチ実行基盤の実装

考察が乗っていてとてもわかりやすいです

Kinesis Producer Library(KPL)とfluentdとLambdaを連携してKinesisのスループットを上げる

2つ目の記事に関して解説が追加された記事になります。わかりやすい。

Data Storage

Amazon DynamoDB

公式ですので、とりあえず目を通します

API Gateway

とりあえずAPI Gatewayはとっても便利という印象でした。 EC2がいいのか、API Gateway + Lambdaがいいのかとか色々悩みましたが、そもそもいろんな使い方があることが勉強になります。

以下、入門編という感じで資料です。

API ホスト名としてのカスタムドメイン名の設定 - Amazon API Gateway

【新機能】Amazon API GatewayがACM (AWS Certificate Manager)に対応。簡単に独自ドメインAPIがSSL化。 | Developers.IO

API Gateway リソースの CORS を有効にする - Amazon API Gateway

API Gateway API のリクエストパラメータをマッピングする - Amazon API Gateway

Amazon API GatewayからAWS Lambdaにパラメータを渡す方法 - Qiita

EC2からLambdaへの移行

AWS 謹製 aws-serverless-express を使って APIGateway + Lambda + Node + Express で RESTful サービスの雛形を最速で作る - Qiita

expressでEC2に構築済のサービスをLambdaに移行していきたかったので、役立ちました

AWS LambdaからIAM RoleのCredential情報を取得し、RedshiftのCOPY処理に利用する

結局毎回権限周りであれこれチグハグするので、こうした記事は大変助かります

既存プロジェクトをRails5.1にアップデートしたので、webpackerを使って、楽できる感じの JS(ES6)とRailsの開発環境を構築してみた

qiita.com

経緯

環境を以下のようにアップデートしたので、webpackerを導入しました。 - Rails 5.1.3

既存プロジェクトにwebpackerを導入する

  • 基本的に README を見れば問題ないです
    • またのコマンドを打てば、サンプル(大元になるガイド)ファイルも出力してくれるので、乗っかればやりやすいです。
gem 'webpacker', '~> 2.0'
# OR if you prefer to use master
gem 'webpacker', git: 'https://github.com/rails/webpacker.git'

gem 'foreman'
bundle install
./bin/rails webpacker:install

vueを導入

  • elmやreactも導入するコマンドがあります
./bin/rails webpacker:install:vue
const { env, settings } = require('../configuration.js')

const isProduction = env.NODE_ENV === 'production'
const extractCSS = !settings.dev_server.hmr

module.exports = {
  test: /\.vue$/,
  loader: 'vue-loader',
  options: {
    extractCSS: isProduction || extractCSS
  }
}

既存環境との両立

  • 既存の古いJSもたくさんあったので、一気にwebpacker環境に持っていくのは大変そうだったため、共存させつつ、少しずつ移行していくことにしました。
  • webpacker環境のファイル構成を app/frontend 以下に構築します。
  • app/frontend/packs 以下のファイルを、 public/packs 以下に、 Compileした後に 出力します。
default: &default
  source_path: app/frontend
  source_entry_path: packs
  public_output_path: packs

.
.
.
const webpack = require('webpack');
const merge = require('webpack-merge');
const sharedConfig = require('./shared.js');
const { settings, output } = require('./configuration.js');

module.exports = merge(sharedConfig, {
  devtool: 'cheap-eval-source-map',

  output: {
    pathinfo: true
  },
.
.
.


});

viewファイルからのインクルード

= stylesheet_pack_tag 'hoge/style/main' # /public/packs/hoge/style/main.css を読みます
= javascript_pack_tag 'hoge/main' # /public/packs/hoge/main.js を読みます
= javascript_include_tag 'http://d3js.org/d3.v3.min.js' # おなじみのタグも使えます

開発の為の工夫

webpacker環境下のファイルを編集したらブラウザがライブリロードされてほしい

  • rails s と合わせて、 webpackerもwatchしたまま走らせたい
    • formanを使って、両方を一つの npm run script で叩く
web: bundle exec rails s
# watcher: ./bin/webpack-watcher
webpacker: ./bin/webpack-dev-server
{
  "scripts": {
    "dev": "bundle install && bundle exec foreman start -f Procfile.dev",
    "build": "bundle exec rails webpacker:compile",
  },
}

開発の際は

yarn dev を叩いて開発

d3.js初心者が3時間でRails5.1に複数のグラフを実装した際に参考にした記事

作ったグラフを行動軌跡図と棒グラフです。

References

Path

Grouped Bar Chart

PieChart

Donut Chart

v3 -> v4

ダブルクオーテーション " が " になるのを防ぐなど、String Interpolation で変数を Unescaped にする方法

qiita.com

pugのテンプレート内に変数を展開する String Interpolation で、エスケープさせる方法とさせない方法についての確認です。

ただ ドキュメント をちゃんと読めば済む話ですが、なかなかたどり着くことができなかったので、メモしておきます。

- var hogeVar = "hoge";
script.
  const valEscaped = #{hogeVar};   // => "hoge"
   const valUnescaped = !{hogeVar}; // => "hoge"

"Cannot truncate a table referenced in a foreign key constraint" 外部キー制約でtruncate tableできなかった時の対応

qiita.com

あんまりtruncate tableする機会がいままでなかったのですが、mysqlでtruncateしようとしたら、外部キーの制約があるからできませんってエラーが出てきたとき、どうしてもtruncateしたい場合は次の様に外部キーチェックを一度キルトいいようです。

mysql> truncate table messages;
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`database_name`.`table_name`, CONSTRAINT `foreign_key_name` FOREIGN KEY (`foreign_key_culumn_name`) REFERENCES `database_name`.`target_table_name` (`id`))
mysql> set foreign_key_checks = 0;
mysql> truncate table table_name;
mysql> set foreign_key_checks = 1;

migrate時にエラーメッセージが表示されていなくても、エラーになる場合

qiita.com

laravel 初心者の備忘録です。

php artisan migrate してみたら、migrateは走って

migrated xxxxxxxx
migrated xxxxxxxx

って表示されて特にエラーは表示されていないのに、エラーになることがありました。

とりあえずログ表示を増やそうと思ったので、コマンドを確かめました。

php artisan migrate --help

Usage:
  migrate [options]

Options:
      --database[=DATABASE]  The database connection to use.
      --force                Force the operation to run when in production.
      --path[=PATH]          The path of migrations files to be executed.
      --pretend              Dump the SQL queries that would be run.
      --seed                 Indicates if the seed task should be re-run.
      --step                 Force the migrations to be run so they can be rolled back individually.
  -h, --help                 Display this help message
  -q, --quiet                Do not output any message
  -V, --version              Display this application version
      --ansi                 Force ANSI output
      --no-ansi              Disable ANSI output
  -n, --no-interaction       Do not ask any interactive question
      --env[=ENV]            The environment the command should run under.
  -v|vv|vvv, --verbose       Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
 Run the database migrations

-vvv ってやれば一番詳しく出るんですね。 というわけでで詳しくログをだしてみることができました。

php artisan migrate -vvv

Laravelでtest用DBにmigrateする方法

qiita.com

Laravel入門者の備忘録です。

テスト用DBの設定を記載します。

mysqlでもpostgresでもsqliteでもなんでもいいdせうが、surfixに _testingをつけておくとわかりやすいです。

 'mysql_testing' => [
   'driver'    => 'mysql',
   'host'      => env('TESTING_DB_HOST', 'localhost'),
   'database'  => env('TESTING_DB_DATABASE', 'forge'),
   'username'  => env('TESTING_DB_USERNAME', 'forge'),
   'password'  => env('TESTING_DB_PASSWORD', ''),
   'charset'   => 'utf8',
   'collation' => 'utf8_unicode_ci',
   'prefix'    => '',
   'strict'    => false,
  ],

環境変数の設定

TESTING_DB_HOST=localhost
TESTING_DB_DATABASE=homestead_testing
TESTING_DB_USERNAME=homestead
TESTING_DB_PASSWORD=secret

command

php artisan migrate --database=mysql_testing

参考