Hatena::ブログ(Diary)

イノベートな非日常 Twitter

2016-05-04

javascript reduceで オブジェクトの配列を、元のオブジェクトのidをキーnameを値にしたオブジェクトに詰め直し

文章にするとややこしいが、以下のオブジェクトの配列を

var in = [
{
  id   : 11       ,
  name : "みかん" ,
},
{
  id   : 21       ,
  name : "いちご" ,
},
{
  id   : 45       ,
  name : "バナナ" ,
}
]

以下のように変換したい

var out = {
  11 : "みかん",
  21 : "いちご",
  45 : "ばなな",
}

主には、プログラム内部で使っているオブジェクトから、セレクトボックスを作るときに使うキーバリューのオブジェクトを作るときに使う

var out = in.reduce((x,y)=>{x[y.id]=y.name;return x},{}));
console.log(out)

returnを省略したバージョン

var out = in.reduce((x,y)=>(x[y.id]=y.name) && x,{}));
console.log(out)

※ 注意!! x[y.id]=y.name の部分を()で括って(x[y.id]=y.name)

とすること、そうしないとy.name && xの方が先に処理される。

x[y.id]=y.nameの部分が、関数だったりメソッドだったりするときには()は必要ない。

代入文(=)のときだけ注意が必要。例えばx.concat(y.name)であれば大丈夫

2016-04-30

fluentd mysql plugin設定

nginxの設定

  • /etc/nginx/conf.d/log.conf
log_format ltsv 'time:$time_iso8601\t'
                'ip:$remote_addr\t'
                'method:$request_method\t'
                'host:$host\t'
                'uri:$request_uri\t'
                'protocol:$server_protocol\t'
                'status:$status\t'
                'referer:$http_referer\t'
                'ua:$http_user_agent\t'
                'size:$bytes_sent\t'
                'request_time:$request_time\t';

fluentdの設定

  • /etc/td-agent/td-agent.conf
<source>
  type tail
  format ltsv
  time_key time
  time_format %Y-%m-%dT%H:%M:%S%z
  tag nginx.access.log
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/buffer/access.log.pos
</source>

<match nginx.access.log>
  type copy
  <store>
  type mysql
  host localhost
  database access 
  username root 
  password 
  include_time_key yes
  key_names time,ip,method,host,uri,protocol,status,referer,ua,size,request_time 
  table customer_action_logs
  sql INSERT INTO access_log (time,ip,method,host,uri,protocol,status,referer,ua,size,request_time) VALUES (?,INET_ATON(?),?,?,?,?,?,?,?,?,?)
  flush_interval 10s
  </store>

  <store>
    type file
    path /var/log/td-agent/request.json
  </store>
</match>

MySQLのテーブルを作成

CREATE TABLE `access_log` (
 `id`           bigint(20)  unsigned  NOT NULL AUTO_INCREMENT,
 `time`         datetime    NOT NULL  DEFAULT '0000-00-00 00:00:00',
 `ip`           int(10)     unsigned  NOT NULL COMMENT 'リモートIPアドレス',
 `method`       enum('GET','POST','HEAD','CONNECT','PUT','DELETE','TRACE','OPTIONS') 
                                      NOT NULL DEFAULT 'GET' COMMENT 'HTTP メソッド 通常GET またはPOST',
 `host`         varchar(255) NOT NULL COMMENT '仮想ホスト名',
 `uri`          varchar(500) DEFAULT NULL,
 `protocol`     enum('HTTP/1.0','HTTP/1.1','HTTP/2.0','')
                                      NOT NULL COMMENT 'HTTPプロトコル',
 `status`       varchar(5)   DEFAULT      NULL COMMENT 'HTTPステータス',
 `referer`      varchar(255)          NOT NULL COMMENT 'リファラー',
 `ua`           varchar(255) DEFAULT      NULL COMMENT 'ユーザーエージェント',
 `size`         int(10)      unsigned NOT NULL COMMENT 'リクエストサイズ',
 `request_time` float        unsigned NOT NULL COMMENT 'リクエストタイム',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

fluentdのmysqlのプラグインでtimeをinsertする

ぐぐっても、間違った設定ばっかり、上位に表示されているのでメモとして

原因、fluentdは、time_key timeで指定したキーはfluentdのタイムスタンプとして使用するので、デフォルトではキーから外されます。

なので、下の公式ページにあるようにkey_nameでtimeを指定したい場合は『include_time_key yes』を指定します。


  • アクセスログにもう1つ日時カラムを出力する

とか

  • MySQLの方には日付カラムを作らない ⇒これログ取る意味あるの?

とかそんなことする必要ありません。

しかし、これ、他のプラグインでもダミーの日時フォーマットを生贄にして設定とか良くあって拡散されているけど、なんで正しい設定が拡散されてないんだろ。

2016-04-28

ubuntu 15.04 にfluentdの最新版(0.12.20)のmysqlプラグインをインストールする。

なんか、インストール場所とかプログラム名とかがもろもろ変わっている。

fluentdのプラグイン専用のパッケージ管理コマンドも

 /usr/lib/fluent/ruby/bin/fluent-gem list
↓
/usr/sbin/td-agent-gem list
apt-get install libmysqlclient-dev
/usr/sbin/td-agent-gem install fluent-plugin-mysql

参考

ubuntu 15.04 にfluentdの最新版(0.12.20)をインストール

ubuntu標準ではapt-getでfluentdはインストールできないので

最初にレポジトリキーを取得し、レポジトリを追加する

wget http://packages.treasure-data.com/debian/RPM-GPG-KEY-td-agent
apt-key add RPM-GPG-KEY-td-agent
curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
service td-agent start
td-agent --version

2016-04-18

windows7 vagrant でredmineをインストール

前回、dockerにredmineを入れて利用していたが、データ保全に難ありかつ、

docker-composeを使ったところでインストールが面倒ということで、

vagrantでredmineを入れることにした。

インストール自体は、dockerよりもさくっと終了

データがデカくてダウンロードに時間が掛かることと、

それに伴いディスク容量、CPU資源を消費することはしょうがないかな。

と思ったら、動かなかった。

VirtualBox 5で異なるVirtualBoxのバージョンのイメージを使うと、ホストオンリーアダプターが増殖して、うまく動作しないらしい。

vagrant upで起動後、ホストオンリーアダプターをVirtualBoxで手動で指定

以後はvagrantは使用しないようにした。

ベースがchef/centos6.5なので、VirtualBox 4のイメージ??

ちなみに、多くのboxの元に使われているchef/centos6.5はもうない。

bento/boxes/centos-6.7

になった。

最近、直近1年の記事がもう使えなくなってることが多くて非常に困る。

時代の流れが速すぎる。ぐぐるのに直近3か月のフィルター設定をしておくべきか

IDとパスワードはadmin/admin

2016-04-17

javascript date diff

日時の差分、ぐぐってもどれも微妙なものしかなかったのでメモ

2016/01/01〜2016/01/07までの日数

(new Date('2016/01/07')-new Date('2016/01/01'))/86400000

2016-04-16

ES6時代のスマフォ判定

if(['iPhone','iPad','Android'].some(
               x => navigator.userAgent.includes(x)
){
 .
 .
 .
}

2016-04-13

データベースのテーブルのカラムの命名規則

cakephpみたいにprimary_idをidとかにしちゃうと、リバースでER図を作成させるときに悲惨。

単純なテーブル設計で、ORマッパーだけでなんとかなっちゃうのならそれでいいが、

そのうちサービスが大きくなって、SQLが必要になった場合にSQLでのメンテナンスコストが増す。

かといって、なんでもテーブル名_カラム名にしちゃうとそれはそれで冗長。さじ加減が難しいところか。

論理削除はdelete_flgではなくてis_deletedの方が確かによさそう。

削除フラグだと、delete_flgだったり、delete_flagだったり表記ゆれでハマる。