ぶろぐ

日記です

re:dash運用開始

エンジニア⇔ビジネス間で「こういうデータみたいです〜」「ユーザー数が〜」みたいなの、どこの現場に行ってもあると思うんですが、毎回クエリ発行してCSVに整形してExcelで開けるように文字コード変えて・・・と何かと作業になりがちです。自作ツールや管理画面作ってもいいんですが、ソリューションでさくっと解決できた。


クエリ作って、re:dashに貼り付けて、軽く可視化(今のとこpivot使うことが多い)して「どーぞ」と渡せる。次回からはここ見てくださいと。


便利!


今のところちゃんとワークしそうな印象。

レンタルサーバーでGolangを使うとき

hetemlなど、基本PHP前提のレンタルサーバーgolangを動かしたくなってしまった時に気をつけるべき知見を得た。(そもそもPHPで書けよ、って話だが)

おまとめ(困ったこと)

  • そもそもデーモンを動かせないので、net/httpを使った常駐型のhttpサーバーは実行できない。
    • バックグラウンド実行できると見せかけ、ログアウトし一定時間経つと消えている。
    • mod_rewritelocalhost:8080のgolangへリバースプロキシするという荒業を試し、リクエストが通ることは確認できたが安定稼働できないため諦めた。
    • もしかするとできないこともないかもしれないが、流石に力技すぎる。(supervisord入れようかとかしたけど筋が悪い臭いがプンプン。phpで書きなおそうか考え始める。)
  • golangでもcgiが作れるので、cgiを作ってそれを呼び出す。
  • cronでgolangのバッチを動かしたくなったら、実行スレッド数に気をつける。runtime.GOMAXPROCS()で制御可能。

golangCGI

net/http/cgi パッケージにcgiを作るためのライブラリがあるのでこれを使用する。
POST/GET パラメーターやCookie、Header等を使用することが可能。
ぼくは普段gin等のframework使っているのであれだが、net/httpでゴリゴリサーバー書いている人なら違和感なく作ることができるんだと思う。

プロセス制限注意

共有サーバーって制限が強い><

ulimit -u
15

たったの15・・・goroutineを使うと一発で死にます。

runtime.GOMAXPROCS(1)

などでスレッド数1に変更。

sqlのopen connectionも一応減らしておいた

db, err := sql.Open(conf.Driver, conf.Dsn)
db.SetMaxIdleConns(1)
db.SetMaxOpenConns(1)

AWSとかVPSとか自由な世界で生きているとレンサバ辛い。
CGIってまあアリだなぁと思った。Apache + PHP or CGIしか動かせないようなところでは。
意外と戦える!

車で京都・大阪旅行

水曜の深夜に出発し、土曜日の深夜に帰宅開始
関東発で行き12時間、帰り7時間半
高速代+ガソリン代で一人10400円ぐらいで済んだ。
宿泊はゲストハウス2700円(すごく腰の低い方だった)、二日目は友人宅
京都で行ったのは金閣寺、嵐山竹林、千本鳥居、清水寺、などなど
www.kyo-yado.com

かなり安く行けたと思う。

MySQLからデータをCSVで出力してExcelで開けるようにする

SELECT * FROM m_hogehoge
INTO OUTFILE '/tmp/m_hogehoge.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"';

nkf -s --overwrite /tmp/m_hogehoge.csv

いつもググっている気がする。CSVのエスケープ処理的なこともやってくれる。

ZX-10Rのタンク凹みをパテ埋めしてみた

転んでガッツリタンク凹ましてしまった。
ネットで見積もりできるところに問い合わせたら「弊社では直せません、タンク買え買えたほうがいいかも」みたいな回答をもらってしまったので、自分である程度ごまかせるレベルを目標に直してみようかと。

まずは前買ったインパクトレンチにワイヤーブラシを取り付けてゴリゴリと磨く。
f:id:ariteku:20160716205521j:plain

まぁまぁいい感じに。ここから少しサンドペーパーで磨きました。
f:id:ariteku:20160716205528j:plain

ガッツリとパテをもる
f:id:ariteku:20160716205533j:plain

フラッシュ当てるとそれっぽく見えるけど、かなり凹凸ある・・・
けどパテを盛る段階ではそういうものみたい。サンドペーパーで磨いて平面になればOK
f:id:ariteku:20160716205529j:plain

明日硬化したら磨いて、再度盛って適当に塗るかな!

それなりに面が出て、ステッカーをベタベタはるかたちでごまかせればいいと思う!

追記:
今日もパテ埋めした!
blog.goo.ne.jp
ここまで綺麗にやるのは無理だろうなぁ

ltsv形式のログをs3に格納するようにtd-agentを設定した

ltsvでs3にとりあえず上げた。後でhiveでもsparkでもいくらでも集計できるように!
Redshiftに直接取り込むならtsvかjsonじゃないとダメみたいだけど…とりあえずltsvで。
scala使う機会がなさすぎるので簡単な集計でも無駄にspark使いたい・・・。
複数のログがある場合、fluent-plugin-forest を使うと設定をDRYにできてすばらすかった。

インストール

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

# start
sudo service td-agent start

# plugin install
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-s3
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-forest

td-agent.conf

<source>
  @type     tail
  format    none
  time_key  time
  path      /var/log/xxx/app/xxx-api.app.log
  pos_file  /var/log/xxx/app/xxx-api.app.log.pos
  tag       s3.app
</source>

<source>
  @type     tail
  format    ltsv
  time_key  time
  path      /var/log/xxx/access/xxx-api.access.log
  pos_file  /var/log/xxx/access/xxx-api.access.log.pos
  tag       s3.access
</source>

<source>
  @type     tail
  format    ltsv
  time_key  time
  path      /var/log/xxx/action/xxx-api.action.log
  pos_file  /var/log/xxx/action/xxx-api.action.log.pos
  tag       s3.action
</source>

<match s3.*>
  type    forest
  subtype s3

  <template>
    s3_region          ap-northeast-1
    s3_bucket          production-xxx-log
    path               xxx-api/${tag_parts[1]}/%Y/%m/%d/%H/${tag_parts[1]}-%{hostname}_

    buffer_type        file
    buffer_path        /var/log/fluent/${tag}

    time_slice_format  %Y%m%d%H
    utc

    flush_at_shutdown  true

    include_time_key   true
    format             ltsv
  </template>

  <case s3.app>
    include_time_key   true
    format             single_value
  </case>

</match>