Hatena::ブログ(Diary)

イノベートな非日常 Twitter

2016-06-29

phpでarray_xxx系は使っちゃダメ

結論、現時点でarray_map系で匿名関数をコールバックするのは止めておけ

パフォーマンスが遅くて話にならん。非同期でストリーム処理とかもしないし。

ビックデータをarray_xxxで処理すると重いし、メモリ不足で死んじゃいます。


C#とか、まともな関数言語系だったら、非同期でストリーム処理してくれる筈。

phpは関数言語風に書けますという、なんちゃってコールバックの仕組みなのでだめぽ

altphp作るしか...。だったらphpである必要がねぇ....。

恐らく、tickerや、ストリーム関数あたりを使えば

phpでもおしゃれかつ、パフォーマンスの出る書き方ができると思うのだが、、、。

ライブラリを作るのは多分地獄

Uncaught Error: Syntax error, unrecognized expression: unsupported pseudo: visibleundefined

Uncaught Error: Syntax error, unrecognized expression: unsupported pseudo: visibleundefined

やたら長いスタックトレースが出るが、

未サポートの疑似要素が指定されている、、、

要はjqueryのselectorが間違っている

2016-06-19

local開発環境のphpmyadminの設定

自分のローカルの開発環境でブチブチセッションが切れるのはナンセンスなので、セッションタイムアウトを伸ばす。

※ 本番、インターネット接続環境で設定する場合はセキュリティ上のリスクが発生するので十分注意してください。

ini_set("session.gc_maxlifetime", 43200);
$cfg['LoginCookieValidity'] = 43200;

自分のローカルの開発環境でわざわざログインする必要もないので、自動でログインするように設定

※ 本番、インターネット接続環境で設定する場合はセキュリティ上のリスク...以下略

ini_set("session.gc_maxlifetime", 43200);
    //$cfg['Servers'][$i]['auth_type'] = 'cookie';
    $cfg['Servers'][$i]['auth_type'] = 'config';

参考

2016-06-02

javascriptで array[]= は「でできない

phpとか他の言語ではできるが、javascriptではできないので

素直にpush使うかconcatを使う

arr.push(val)

arr = arr.concat(val)

javascript 配列のmax min

Array.min

Array.max

あたりがあると思いきやない。

Math.max.apply(null, a);
Math.min.apply(null, a);

頻繁に使うならprototypeでメソッド生やしておいてもいいかも

Array.prototype.max = function(){
  return Math.max.apply(null, this);
}

Array.prototype.min = function(){
  return Math.min.apply(null, this);
}

nanやnullに対応しようとするとちょっとめんどくさい。

以下の記事のコメントにあったものをアロー関数で書いたらスマートかも

ただ、パフォーマンスはよくないかもだけど

Math.max.apply(null, list.filter(v =>
  isNumber(v) && !isNaN(v)
);
list.reduce((prev, curr) =>
  (((isNumber(prev) && !isNaN(prev)) ? prev : -Infinity) > ((isNumber(curr) && !isNaN(curr)) ? curr : -Infinity)) ? prev : curr
);

2016-05-29

javascript オブジェクトの配列で、オブジェクトの中に配列のindexを追加したい

var obj=[
 {
   name:"みかん"
 },
 {
   name:"りんご"
 },
 {
   name:"ばなな"
 }
]

これを

var obj=[
 {
   id:0
   name:"みかん"
 },
 {
   id:1
   name:"りんご"
 },
 {
   id:2
   name:"ばなな"
 }
]

としたい

console.log(JSON.stringify(obj.map((x,i) => (x.id=i) && x),null,' '))

ワンライナーで書けるが0の場合がおかしくなる。

[
 0,
 {
  "name": "りんご",
  "id": 1
 },
 {
  "name": "ばなな",
  "id": 2
 }
]

代入文で0が代入されると条件式がfalseになるから

console.log(JSON.stringify(obj.map((x,i) => (x.id=i)|1 && x),null,' '))

なので代入式の後に|(or)1(=true)を付けて強制的にtrueにする

[
 {
  "name": "みかん",
  "id": 0
 },
 {
  "name": "りんご",
  "id": 1
 },
 {
  "name": "ばなな",
  "id": 2
 }
]

javascript メソッドの呼び出し元を取得する

関数の場合は

arguments.callee.caller.toString.replace(/{(.|\n)*}/, '')

だが、これをメソッドで使っても

'caller' and 'arguments' are restricted function properties and cannot be accessed in this context

とエラーがでて取得できない。

Function.caller().name

スタックトレースで取得

new Error().stack

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