Macでlogrodate

install

brew install logrotate

適当にplistつくる

sudo nvim /Library/LaunchDaemons/logrotate.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>logrotate</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/sbin/logrotate</string>
    <string>/etc/logrotate.conf</string>
  </array>
  <key>Disabled</key>
  <false/>
  <key>RunAtLoad</key>
  <false/>
  <key>StartCalendarInterval</key>
  <dict>
    <key>Minute</key>
    <integer>0</integer>
  </dict>
</dict>
</plist>

下準備

mkdir /usr/local/var/lib/
sudo /usr/local/sbin/logrotate -f /usr/local/etc/logrotate.conf

起動

sudo launchctl load /Library/LaunchDaemons/logrotate.plist

停止

sudo launchctl unload /Library/LaunchDaemons/logrotate.plist

参考にした

Hosting Rails apps on a Mac OS X server – Jason Codes

Macでtd-agent

td-agentの標準的な環境をつくる

DMG拾ってくる場所

Index of packages.treasuredata.com/2/macosx

設定ファイルの場所

/etc/td-agent/td-agent.conf

logの場所

/var/log/td-agent/td-agent.log

起動

sudo launchctl load /Library/LaunchDaemons/td-agent.plist

停止

sudo launchctl unload /Library/LaunchDaemons/td-agent.plist

動作確認のためtsv食わせてみる

<source>
  type tail
  format tsv
  keys col1,col2,col3
  tag hoge.fuga
  path /usr/local/var/log/hoge.log
  pos_file /tmp/td-agent.pos
</source>

<match hoge.**>
  type stdout
</match>

plugin入れる

fluent-plugin-kinesis

sudo /opt/td-agent/embedded/bin/gem fluent-plugin-kinesis

Macでrubyの環境つくる

rbenv

todo

rails

gem install rails --version "5.0.0.1" --no-rdoc --no-ri

参考

rbenv

rbenv + ruby-build はどうやって動いているのか - takatoshiono's blog

Homebrewでrbenvを設置する。 - Qiita

Homebrewでrbenvをインストールする | Mawatari.jp

gem

gemspecとGemfileの役割をはっきりさせておく

Bundlerを使ったGemパッケージの管理 - Ruby on Rails入門

gemspec と Gemfile と Gemfile.lock との違い. - Qiita

Web上で実行できる処理系まとめ

swift

swiftlang.ng.bluemix.net

tsvのログをtd-agentで、mongodbにぶちこむメモ

前提

mongodb側

(インストールは終わったものとして)

とりあえず動くだけの設定

vim /etc/mongod.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid
net:
  port: 27017
  bindIp: xxx.xxx.xxx.xxx

mongod開始

sudo service mongod start

agent側

td-agent導入

curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sudo sh

td-agentの設定を書く

vim /etc/td-agent/td-agent.conf
<source>
  type tail
  format tsv
  keys col1,col2,col3
  tag hoge.fuga
  path /var/log/hoge/hogehoge.%Y-%m-%d
  pos_file /tmp/hoge.pos
</source>
 
<match hoge.**>
  @type mongo
  host xxx.xxx.xxx.xxx
  port 27017
  database hogedb
  collection hogelog
  capped
  capped_size 1024m
  flush_interval 10s
</match>
 
<match fluent.**>
  @type mongo
  host xxx.xxx.xxx.xxx
  port 27017
  database hogedb2
  collection hogelog2
  capped
  capped_size 1024m
  flush_interval 10s
</match>

agent開始

sudo service td-agent start

こんな感じで設定すれば、ログが入っていく

Macのfinderがなんか壊れた時

rm ~/Library/Preferences/com.apple.finder.plist

して、再起動でなんか直った。保証はできかねます( ー`дー´)キリッ

なんだけど、それでもダメなことが多く、結局だめになったらkillしてます。。。

killall Finder

[改訂版]  Mac OS X ターミナルコマンド ポケットリファレンス

[改訂版] Mac OS X ターミナルコマンド ポケットリファレンス

Java8時代のenum逆引きあれこれ

前に同僚と話題になったので。最初HogeAで考えていて、同僚がHogeBがいいよといい。

実行コード

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.google.common.collect.Maps;

public class EnumSample {

    public static void main(String[] args) {

        {
            long base = System.currentTimeMillis();
            for (int i = 0; i < 1000000; i++) {
                HogeTypeA type = HogeTypeA.getEnum(1);
            }
            long diff = System.currentTimeMillis() - base;
            System.out.println("testA:" + String.valueOf(diff));
        }

        {

            long base = System.currentTimeMillis();
            for (int i = 0; i < 1000000; i++) {
                HogeTypeB type = HogeTypeB.getEnum(1);
            }
            long diff = System.currentTimeMillis() - base;
            System.out.println("testB:" + String.valueOf(diff));
        }
        {

            long base = System.currentTimeMillis();
            for (int i = 0; i < 1000000; i++) {
                HogeTypeC type = HogeTypeC.getEnum(1);
            }
            long diff = System.currentTimeMillis() - base;
            System.out.println("testC:" + String.valueOf(diff));
        }

    }

}

enum HogeTypeA {

    ON(0),
    OFF(1);

    private int code;

    private HogeTypeA(int code) {
        this.code = code;
    }

    public int code() {
        return this.code;
    }

    public static HogeTypeA getEnum(int code) {
        return toEnum.get(code);
    }

    private static Map<Integer, HogeTypeA> toEnum = new HashMap<Integer, HogeTypeA>() {
        private static final long serialVersionUID = 1L;
        {
            Stream.of(HogeTypeA.values())
                    .forEach(type -> {
                        put(type.code(), type);
                    });
            ;
        }
    };
}

enum HogeTypeB {

    ON(0),
    OFF(1);

    private int code;

    private HogeTypeB(int code) {
        this.code = code;
    }

    public int code() {
        return this.code;
    }

    public static HogeTypeB getEnum(int code) {
        return toEnum.get(code);
    }

    private static final Map<Integer, HogeTypeB> toEnum = Maps.newHashMap();
    static {
        for (HogeTypeB type : values())
            toEnum.put(type.code(), type);
    }
}

enum HogeTypeC {

    ON(0),
    OFF(1);

    private int code;

    private HogeTypeC(int code) {
        this.code = code;
    }

    public int code() {
        return this.code;
    }

    public static HogeTypeC getEnum(int code) {
        return toEnum.get(code);
    }

    private static final Map<Integer, HogeTypeC> toEnum;
    static {
        toEnum = Stream.of(HogeTypeC.values())
                .collect(Collectors.toMap(HogeTypeC::code, type -> type));
    }
}

実行結果

testA:89
testB:48
testC:53

単純な実行だとHogeBが早そう。

Cも悪くなさそうなんだけど、JVMの最適化のせいなのか、Aを抜いて、BとCだけ実行すると下記のようなスコアになるので、Streamは速度いまいちっぽいのよね。

実行結果2

testB:45
testC:118