無気力生活 (ノ ´ω`)ノ ~゜

脱力系エンジニア。てきとーに生きてます。

embulkでBigqueryにテキストデータ流し込めなかった話

ユーザーメッセージを分析するようにBigqueryに流し込んでたんですが、とある日Slackに失敗通知が飛んでいることに気づく

Error: org.jruby.exceptions.RaiseException: (Error) failed during waiting a Load job, get_job(to_aru_server, embulk_load_job_000f1d44
-0935-4cf7-84a9-e00aac16995e), errors:[{:reason=>"invalid", :message=>"Too many errors encountered."}, {:reason=>"invalid", :message=>"CSV
table references column position 2, but line starting at position:147 contains only 2 columns.", :location=>"file-00000000"}]
2017-03-09 06:00:38 +0900 [ERROR] (0017@+fetch_table+fetch_yesterday^sub+for-table=messages) io.digdag.core.agent.OperatorManager: Task failed with unexpected error: Command failed with code 1
java.lang.RuntimeException: Command failed with code 1

なんぞこれ。設定周りに不備があると思って色々調べたんですが、原因が特定できず。 弊社のBigquery師範から、流し込んでるデータに問題あるんじゃないかの指摘を受け、調べてみたら改行を含んだユーザーコメントがいるわけでして(ヽ´ω`)

改行を含んだカラムを扱うときは、--allow-quoted-newlinesが必要とのことなので、liquidにオプション追加すると解消できました

in:
{% include 'common_in' %}
  query: |
    SELECT
      id,
      text,
      created_at
    FROM messages
    WHERE id > 1 
      AND created_at >= "{{ env.TARGET_DATE }}"
      AND created_at < DATE_ADD("{{ env.TARGET_DATE }}", INTERVAL 1 DAY)
out:
{% include 'common_out' %}
  table: messages{{ env.TARGET_DATE | date: "%Y%m%d" }}
  schema_file: embulk/messages.json
  path_prefix: /tmp/messages
  allow_quoted_newlines: 1 # <--------これ
  formatter:
    type: csv
    charset: UTF-8
    delimiter: ','
    header_line: false
    column_options:
      created_at: { format: "%Y-%m-%d %H:%M:%S" }

munin-node再起動して正常に動作するまで少し時間かかるらしい

利用しているIaaSからFailoverをくらい、そのままサービスは動作していたので放置していたんですが、ふとmuninを見ると該当サーバーがモニタできていないことに気づく。

おそらくchkconfigされなかった系だと思われますが、munin-nodeのプロセスがお亡くなりになっていたので、おもむろに service munin-node startするわけですよ。

…5分間隔でモニタしているんだが、一向に描画されねぇ(ヽ´ω`)

とか思ってたら10分くらいしてからモニタされ始めました。 少し時間かかるみたいですね。

provisiningのテスト環境を作ってる

最近、借りてるVPSのスペック変えたんですよ。 ただ、変える課程でサーバー環境まるっと消されたんですよ。

これまで手作業でサーバー構築してたんですが、さすがにつどやるのが面倒になってきたのでコード化したい。 そのへん困ったこと出てきたら、まとめるシリーズになります。

ちなみにこんなものを使おうとしてます

今日書くのはitamaeが動かない問題について
使ってるrubyバージョンは2.3
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin14]

この状態でitamaeを使う最低限のGemfile作っていれます。

source "https://rubygems.org"$
gem "itamae"$

bundle installして、おもむろにitamae help
この時特にバージョン指定してないので、itamae-1.9.10がインストールされます。

# itamae help
/Users/shinoyu/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/itamae-1.9.10/lib/itamae/cli.rb:15:in `initialize': undefined method `upcase' for nil:NilClass (NoMethodError)
    from /Users/shinoyu/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/thor-0.19.4/lib/thor.rb:365:in `new'
    from /Users/shinoyu/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/thor-0.19.4/lib/thor.rb:365:in `dispatch'
    from /Users/shinoyu/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/thor-0.19.4/lib/thor/base.rb:444:in `start'
    from /Users/shinoyu/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/itamae-1.9.10/bin/itamae:4:in `<top (required)>'
    from /Users/shinoyu/.rbenv/versions/2.3.0/bin/itamae:23:in `load'
    from /Users/shinoyu/.rbenv/versions/2.3.0/bin/itamae:23:in `<main>'

おや…?

類似の報告ないか調べてたら、http://kawakubox.hatenablog.com/entry/2016/12/13/014011 にそのままのことが書かれてました。すごくタイムリー。
itamaeのこのバージョンが依存しているthorのバージョンが良くないらしく、これを0.19.1にすれば解決するとのこと。

Gemfileをこんな感じにして入れ直すと正常に実行いけました。

source "https://rubygems.org"
gem "thor", '0.19.1' #明示的にバージョン固定した版を先にいれとく
gem "itamae"
# itamae help
Commands:
  itamae destroy [cookbook|role] [NAME]   # Undo role or cookbook (short-cut alias: "d")
  ....

OKそう

Next.jsがおもしろそう

github.com

Reactアプリケーションをより簡単に作れるものらしい。 チュートリアルしか触ってないので全貌は量れないが、a small framework for server-rendered universal JavaScript webappsと謳われており、素のHTMLの記法でそのままReactアプリケーション作れるところが良さそう。

ぱっと見た限り、riot.jsに思想が近いと思った。

riotjs.com

試して数分でデフォルトポート変えたくなったので調べてみたら、

この辺らしい

https://github.com/zeit/next.js/blob/master/bin/next-start#L7-L16

$(npm bin)/next -p 3001
> Ready on http://localhost:3001

OKそう

いろいろなWebフロントフレームワークが出てきて、何を使えばいいか右往左往してます(´・ω・`) mithril→riotと有力視していたけど、nextが一番素直に見える。 触ってみよう。

個人開発の時間を確保するのは、仕事だらしない人にとって大変であるという話

まあ私のことなんですけどね_(:3」∠)_




今2つくらい個人開発しているプロダクトがあるんですが、 これがまぁ〜、進まない進まない。

いえね、理由は分かってるんですよ。



開発が習慣化していない



これだね。まさしくね。

そもそもなぜ進まないか

本業が比較的忙しい業種のため、帰宅がだいたい23時とかその辺になることが多く、あまり作業時間が取れないということが大きいです。 帰って飯食って風呂はいって…をこなしていくといつの間にか深夜1時。

こんな生活してると、土日を作業に当てようと考えるわけですね。



私こんな感じでも家庭がありまして、家族サービス(この言い方好きじゃないけど)というタスクが遠慮なく時間を奪っていきます。 昼間からデスクに向かっているのがあまり良く思われておらず。そんなことしてる暇あれば子ども遊びに連れていくことを優先せざるを得ない。

あと、親がデスクで作業してるの見ると寄ってきますからね、子ども。やつらのキーボード乱打を阻止するため、なかなか集中できぬ。



結果、今現在は平日の夜中に作業しております。

平日深夜作業の罠

仕事終わってきているので、結局消耗してるんですよね。疲れ果て、帰ってそのまま寝てしまうこともままあります。 次の日も仕事なので長く作業もできず。実質1時間くらいの作業。調べ物が多く、ほぼ進捗無いことが多いです。


進捗がないということは、いつ終わるか見えないことです。 つまり、モチベーションが維持しづらい。

作りたい物があっても、いつしか作業辛くなって、そのうち止まってしまうことになるわけですね。

本業の時間管理をしっかりするべし

そもそもの問題は帰宅が遅いことにあります。

中途半端だから、これやりきって帰る!が常態化しているのは大変イケてない。残業はよほど切羽詰まってないかぎりやるべきではないですしね。 その日やるタスクを決めて、それ終わらせたら帰ることを徹底すること。

早く帰れればその分割ける時間が増やせます。進捗が目に見えて判れば楽しい。



少しずつサイクル変えていって、開発を習慣化できる工夫をしましょう。楽しい個人開発ライフを充実させて行きたいものです( ・`ω・´)

AtomにGoの環境いれるメモ

OSX 10.9で確認

参考にしたものはこれ。

qiita.com

基本記載されている内容どおりに導入していけばだいたい大丈夫です。ありがたや。

GOPATHは環境変数にぶっこんでやればOK。
最近のGolangではこれを見てgo getの参照先として動いてくれてるみたいですね。

微妙にはまったところ

リンク先に記載されている、godefパッケージの入手先、どうやら変更されている模様。

go get code.google.com/p/rog-go/exp/cmd/godef

現状、上記を実行すると、

package code.google.com/p/rog-go/exp/cmd/godef: unable to detect version control system for code.google.com/ path

とエラー吐かれました。

調べてみると、google codeからgithubへ移動している模様。 https://groups.google.com/forum/#!topic/golang-nuts/zJuzr1DfgP8

godefの入手はこうすればOK

go get github.com/rogpeppe/godef


stackoverflowでも同じような投稿ありました。 stackoverflow.com

Windows用バージョン管理ツール「Chocolatey」

もともとはWindowsを個人用PCにしていたのですが、Linux使う仕事をするようになった関係か、Macが非常に使いやすくそっちばかり使ってました(`・ω・´)

とはいえ、やはり自宅PCで作業したい感があり、Windowsでもまともに作業できるようにしたいなと。

Macだと、ベースがUnixなので、何も考えることなく、Homebrewを使えば動作する環境を楽に整えられます!便利!
しかしWindowsではVirtualBoxとかVmWareとか使って仮想化しないと、Linux的な環境を用意することはできません。

sygwin + spy-cygの組み合わせである程度はカバーできるのですが、あくまでUnixを再現しているのに過ぎないため、ちゃんと動かない言語やツールが稀にあります(´・ω・`)

となれば、一番楽に環境整えられるのは、docker + docker machineという選択肢になるわけですね。

Chocolatey

さて、ここから本題。

この記事書いてる時点でのWindowsにDocker導入する最新の方法は、chocolateyです。たぶん。

Windows版Homebrew + Homebrew-caskみたいなイケてるやつです。
インストール自体はかなり簡単。公式サイトに書かれているコマンドをPowerShellで実行するだけです。

が、おそらくそのまま実行すると、実行ポリシーによって、スクリプトの実行がブロックされます。
解消方法はここを参照 https://support.microsoft.com/ja-jp/kb/2411920

いったんExecutionPolicyをUnrestictedにして、インストール後Restrictedに戻す方法ですね。
それを踏まえて、以下をPowerShellで実行してください。

Set-ExecutionPolicy Unrestricted
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
Set-ExecutionPolicy Restricted

あとは適当にYesとかやってれば入ります。
インストールに成功したかどうかはchoco -vですね。バージョン番号出ればOK。

ちなみに、chocolateyの実体はただのexeなので、PowerShellでなくてもcmdやcygwinでも使えます。

dockerのインストール

choco install docker docker-machine

以上。

きっと環境移行にも便利につかえるはず

chocoがサポートしているパッケージはdocker以外にもいろいろあり、以下に対応しているやつが記載されています。
https://chocolatey.org/packages

Pythonとかその辺の環境以外にも、iTunesとかLinqpad、果てはVisual Studioといった、メジャーどころのアプリがあったりします。

もう環境構築これだけでいいんじゃないか(`・ω・´)
chocolateyインストールと、インストールアプリを管理したpsファイル作っておいて、新しい環境で実行するだけでOK。

ようやく、Windowsでもまともにパッケージ管理できるようになりましたね!




ただし、当然ながら日本語とか期待しちゃいけません。基本英語版になります。残念(´・ω・`)
日本語必要としている方は、普通にパッケージダウンロードしてきて入れましょう。