レンタルサーバーでGolangを使うとき
hetemlなど、基本PHP前提のレンタルサーバーでgolangを動かしたくなってしまった時に気をつけるべき知見を得た。(そもそもPHPで書けよ、って話だが)
おまとめ(困ったこと)
- そもそもデーモンを動かせないので、net/httpを使った常駐型のhttpサーバーは実行できない。
- バックグラウンド実行できると見せかけ、ログアウトし一定時間経つと消えている。
- mod_rewriteでlocalhost:8080のgolangへリバースプロキシするという荒業を試し、リクエストが通ることは確認できたが安定稼働できないため諦めた。
- もしかするとできないこともないかもしれないが、流石に力技すぎる。(supervisord入れようかとかしたけど筋が悪い臭いがプンプン。phpで書きなおそうか考え始める。)
- golangでもcgiが作れるので、cgiを作ってそれを呼び出す。
- cronでgolangのバッチを動かしたくなったら、実行スレッド数に気をつける。runtime.GOMAXPROCS()で制御可能。
golangでCGI
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のタンク凹みをパテ埋めしてみた
転んでガッツリタンク凹ましてしまった。
ネットで見積もりできるところに問い合わせたら「弊社では直せません、タンク買え買えたほうがいいかも」みたいな回答をもらってしまったので、自分である程度ごまかせるレベルを目標に直してみようかと。
まずは前買ったインパクトレンチにワイヤーブラシを取り付けてゴリゴリと磨く。
まぁまぁいい感じに。ここから少しサンドペーパーで磨きました。
ガッツリとパテをもる
フラッシュ当てるとそれっぽく見えるけど、かなり凹凸ある・・・
けどパテを盛る段階ではそういうものみたい。サンドペーパーで磨いて平面になればOK
明日硬化したら磨いて、再度盛って適当に塗るかな!
それなりに面が出て、ステッカーをベタベタはるかたちでごまかせればいいと思う!
追記:
今日もパテ埋めした!
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>