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

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

仮想通貨に触れてみた雑感(単なる取引の話)

f:id:gdgd-shinoyu:20171207234405p:plain

つまりbitcoin買いました(割と高値で)

一日の値動きがかなり異常であり、おもしろいぶっ飛び方をするので興味本位で買ってみましたが、今現在だと変なバブル感でていてしばらく失速しそうにない印象です。
まあ、いつガラるか分からない値動きでもあるんですが。遊び半分で小額しか突っ込んでますがどうなることやら。

仮想通貨を個人が購入する場合、「販売所」と「取引所」の2種類が選択肢になります。

  • 取引所
    売り買いのマッチングで行われる。株の板と同じような印象。
    仮想通貨の購入数から手数料として少しばかりの仮想通貨を掠められますが、まあ手数料としては許容できる範囲です。ちなみに自分が買った0.02bitcoinの手数料は0.00003bitcointでした。0.7%くらいですかね。
    長所は販売所と比較して、スプレッドがなく売買価格の縛りがないことですね。
    欠点は暴落暴騰時に決済できない可能性があることです(暴落したとき売りたい人ばっかりになるため)

  • 販売所
    個人間の取引ではなく販売所の中で取引されるものです。PTSみたいなもんですかね。
    スプレッドが適用され購入価格と販売価格に差があります(スプレッド分が運営会社の取り分になってるらしい)。つまりそのとき時点のレートでの取引ができません。
    Monacoinも触ったんですが、だいたい±8%分の乖離があります。結構もってかれますね。なので普段は取引所使うようにしてます。 暴落暴騰時にも取引を受け付けてくれるらしいので、何かあったときはこちらのお世話になることがあるかもしれません。

個人的な用途としては、取引所で自由に売り買いしたいので、それが多くできる運用会社を選びたいところ。
オススメであげられていたbitFlyerだと、取引所で選べるものはBitcoinのみですね。ちょっと物足りない…

bitflyer.jp

個人的には、冒頭に貼ったチャートを使えるbitbankがよいかもです。

bitbank.cc

日本円から取引できる仮想通貨が、

  • Bitcoin
  • Ripple
  • Ethereum
  • Monacoin
  • Litecoin

と、そこそこあるのに加えて、APIが公開されているので自動化等も捗りそうです。

もう少し額を増やしてみて、どれだけのパフォーマンスが出るか楽しみなところです( ・`д・´)

Rubyにおいて要素有無判定にはcountよりempty?使おう、というゆるふわ話

弊社では担当プロダクトごとにエンジニアが複数人付く体制でWEBサービスの開発運用やってます。 その過程でコードレビューを実施してるわけなんですが、

とある日、他の人のコード見ていて要素があるかないか、をこう判定しているコードを見つけました。

## items: Array

return false items.count == 0

countだと要素の数え上げしちゃうんでempty?使った方が効率いいっすよ、というレビューコメントを書いたわけですよ。 その時ふと、「本当にempty?のほうが良いのか?」という疑問が(;・`д・)

気になったので、少し深掘りしました。

countを使う場合

rubyソースコードが公開されてるので、それを見ます。 https://github.com/ruby/ruby/blob/trunk/array.c

rb_ary_countっていうものが該当します。

static VALUE
rb_ary_count(int argc, VALUE *argv, VALUE ary)
{
    long n = 0;

    if (argc == 0) {
        VALUE *p, *pend;

        if (!rb_block_given_p())
            return LONG2NUM(RARRAY_LEN(ary));

        for (p = RARRAY_PTR(ary), pend = p + RARRAY_LEN(ary); p < pend; p++) {
            if (RTEST(rb_yield(*p))) n++;
        }
    }
    else {
        VALUE obj, *p, *pend;

        rb_scan_args(argc, argv, "1", &obj);
        if (rb_block_given_p()) {
            rb_warn("given block not used");
        }
        for (p = RARRAY_PTR(ary), pend = p + RARRAY_LEN(ary); p < pend; p++) {
            if (rb_equal(*p, obj)) n++;
        }
    }

    return LONG2NUM(n);
}

予想どおり、forを回してカウントとってますね。

empty?を使う場合。

一方empty?。これも同じソースコード中に定義が存在します。中身こんなんです。

static VALUE
rb_ary_empty_p(VALUE ary)
{
    if (RARRAY_LEN(ary) == 0)
        return Qtrue;
    return Qfalse;
}

RARRAY_LENしか読んでませんね。中身見るとこうなってます。

#define RARRAY_LEN(ARRAY) RARRAY(ARRAY)->len

arrayが持っているlenというメンバに対して値を取得して判定してますね。 empty?では、要素数え上げしてないので、countより計算量は少ないわけですな。

まあ、この程度の数え上げする・しないの話は、全体の影響度からするとごくわずかな違いでしか無いので、普通にWebやってるだけなら気にする必要はないんですが、実際に蓋開けた結果を知っておくのも大事だと思いました。

Vagrant1.9.4で発生するエラーとその解消法

結論

vagrant plugin install vagrant-share --plugin-version 1.1.8実行してgem更新してやればOK

vagrant --help displays a rubygems error · Issue #8519 · mitchellh/vagrant · GitHub

背景

いま時点の最新版である1.9.4に更新した際に、vagrantを実行するとこんなエラーが発生します。

なお、環境はWindows10Proの10.0.15063ですが、ubuntumacosでも発生している報告があるのでおそらく全環境で発生する模様。

HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- vagrant-share/helper/api (LoadError)
        from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-share-1.1.7/lib/vagrant-share/activate.rb:244:in `<encoded>'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-share-1.1.7/lib/vagrant-share/activate.rb:16:in `RGLoader_load'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-share-1.1.7/lib/vagrant-share/activate.rb:16:in `<top (required)>'
        from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-share-1.1.7/lib/vagrant-share.rb:23:in `block in <class:Plugin>'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/cli.rb:75:in `call'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/cli.rb:75:in `block (2 levels) in help'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/registry.rb:49:in `block in each'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/registry.rb:48:in `each'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/registry.rb:48:in `each'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/cli.rb:69:in `block in help'
        from C:/HashiCorp/Vagrant/embedded/lib/ruby/2.2.0/optparse.rb:917:in `initialize'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/cli.rb:57:in `new'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/cli.rb:57:in `help'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/cli.rb:32:in `execute'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/lib/vagrant/environment.rb:308:in `cli'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.4/bin/vagrant:127:in `<main>']

ここで気になるポイントはここ

from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-share-1.1.7/lib/vagrant-share/activate.rb:244:in `<encoded>'

問題が発生している1.9.4の差分見た限り、特にこの辺に影響ありそうな修正はなさそうでした。

https://github.com/mitchellh/vagrant/compare/v1.9.3…v1.9.4

となるとgemが悪さしているっぽそうですね。対応方法から察するに、1.9.4が参照すべきgem指定が更新されないままリリースされた匂いがします。

このvagrant-shareのgemは公開されていません。hashicorpのサイトのみでホスティングされているようです。

# curl https://gems.hashicorp.com/
<!DOCTYPE HTML>
<html lang="en-US">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="refresh" content="0; url=https://www.hashicorp.com">
        <script type="text/javascript">
            window.location.href = "https://www.hashicorp.com"
        </script>
        <title>HashiCorp</title>
    </head>
    <body>
        If you are not redirected automatically, follow this <a href="https://www.hashicorp.com">link</a>.
    </body>
</html>

なので詳細はわからず(´・ω・`)

minecraft1.7.10用のIC2 classicは2種類ある。安定している方と安定していない方だ

GCPで動かし始めたMinecraftサーバー。IC2 classicを導入して遊んでいたんですが、時折クラッシュすることがありました

// Would you like a cupcake?

Time: 4/22/17 7:16 AM
Description: Ticking block entity

java.lang.IllegalArgumentException: Energy source ic2classic.core.block.wiring.TileEntityElectricBatBox@28fa649b is not added to the enet.
        at ic2classic.core.EnergyNet.emitEnergyFrom(EnergyNet.java:140)
        at ic2classic.core.EnergyNet$EventHandler.onEnergyTileSource(EnergyNet.java:553)
        at cpw.mods.fml.common.eventhandler.ASMEventHandler_30_EventHandler_onEnergyTileSource_EnergyTileSourceEvent.invoke(.dynamic)
        at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:54)
        at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:140)
        at ic2classic.core.block.wiring.TileEntityElectricBlock.func_145845_h(TileEntityElectricBlock.java:139)
        at net.minecraft.world.World.func_72939_s(World.java:1939)
        at net.minecraft.world.WorldServer.func_72939_s(WorldServer.java:489)
        at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:636)
        at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:334)
        at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:547)
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:427)
        at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:685)

色々調べてみたところ、Eneregy関連のロジックに問題があるらしく、Batboxといった電力をプールする系のブロックの電力が空になると発生する模様。遠出して拠点に戻る際、Batboxがあるところに近づくと確実に発生するので、チャンクロードのタイミングで発生しているっぽい。

この現象が発生した後、インする度にサーバーが即死するという困った状況に見舞われるわけです(´・ω・`)

結論としては、1.7.10に対応したIC2 classicは2種類あり、今回問題が発生したimmbis版ではなく、もう一つのSpeiger版を使うことで回避できました。

ただし入れ替えすると、ワールドに設置していたimmbis版のマシンはごそっと消滅します。 機能的にはほぼ同一ですがMod自体が異なるので、まーしょーがないですね。

fiddlerでiosの通信を解析するためにやったこと

単純にプロキシ機能使っただけです、はい。

最近のMacbook Proの迷走に付き合いきれず、最近Windowsに戻りました。 Macのときはcharlesで通信見てたんですが、Windowsでどうやるんじゃい?ということで昔Fiddlerを使っていたことを思い出したわけです。

手持ちのIOSの通信を覗き見するためにやったことが以下になります。

手順

  1. Fiddlerのダウンロード
  2. [tool]-[telerik fiddler options]-[connections]-{Allow remote computers to connect}=ONでPC外からのリクエストを受け付けるようにする
  3. HTTPSの通信を取りたい場合、このままだと中身の解析ができないので、CAの認証をする。[tool]-[telerik fiddler options]-[HTTPS]の設定を変更
  4. {Capture HTTPS CONNECTS}=ON
  5. {Decrypt HTTPS traffic}=ON
    通知出るがNOで問題なし。この設定をすることでIOS側にCA証明書の導入が可能になる。
  6. IOSで、プロキシ設定を有効にする。 デフォルトだと、{host:8888}に設定すればOK
  7. 設定したら、safariを開き、” http://ipv4.fiddler:8888 ”へアクセスすると、PC側のFiddlerからCA証明書を取得できるので、それをインストールする

参考資料

http://qiita.com/rch850/items/6d550d01d4c76c692d89

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分くらいしてからモニタされ始めました。 少し時間かかるみたいですね。